لوجات Nginx بتتراكم عندك من شهور؟ هنا خطة تحليل يومي مجاني
لو عندك سيرفر Nginx شغّال على الإنتاج من فترة ومفيش حد بيفتح الـ access log، أنت فعليًا أعمى عن تلات حاجات مهمة: مين بيضربك traffic مش حقيقي من bots، فين صفحات الـ 404 اللي بتهرّب زوار، وأي endpoints بتاخد وقت أكتر من اللازم. GoAccess بيحلّ التلاتة دول في 5 دقايق إعداد و0 دولار شهريًا.
المشكلة باختصار
ملف access.log عند Nginx بيكبر بمعدل 50 إلى 200 ميجابايت في اليوم لأي موقع فيه آلاف الزوار. ELK Stack (Elasticsearch + Logstash + Kibana) بيحلّ المشكلة لكن بتكلفة 60 إلى 150 دولار شهريًا على حجم متوسط، وLoki مع Grafana محتاج إعداد أعقد وسيرفر منفصل. GoAccess binary صغير بيقرأ اللوج مباشرة ويولّد تقرير HTML جاهز. لا قاعدة بيانات، لا indexer، لا search cluster.
خليني أوضحهالك بمثال بسيط الأول
تخيل إنك صاحب محل بقالة، وعندك دفتر كبير في آخر اليوم بيتسجّل فيه كل زبون دخل، إيه اللي اشتراه، ووقت الزيارة. المشكلة إن الدفتر ده لوحده بلا فايدة — محدش عنده وقت يقرا ألف صفحة كل ليلة.
GoAccess هو زي محاسب شاطر بيروح المحل كل ليلة، بياخد الدفتر، ويرجّعلك ورقة واحدة فيها: عدد الزباين، أكتر 10 منتجات اتباعوا، أوقات الذروة، ومين دخل من غير ما يشتري. أنت مش محتاج تستأجر مكتب محاسبة كامل (وده ELK) علشان تعرف ملخص يومك.
على مستوى Nginx، "الدفتر" هو /var/log/nginx/access.log، و"المحاسب" هو GoAccess، و"الورقة اليومية" هي ملف HTML واحد بيتبعتلك على Slack.
GoAccess تقنيًا — اللي بيحصل تحت الكابينة
GoAccess بيعمل parsing للـ log format اللي تحدده (سواء Nginx default أو custom format)، وبيخزّن counters في memory مؤقت عبر Tokyo Cabinet أو in-memory hash tables، وبيصدر الناتج في ثلاث صور: terminal report مباشر، ملف HTML ثابت، أو JSON للـ piping. الفرق الجوهري بينه وبين ELK: GoAccess مش بيخزّن اللوج الخام، بيخزّن aggregations فقط. ده بيوفر حوالي 95% من المساحة مقارنة بفهرسة كل سطر في Elasticsearch.
الخطوات العملية — من صفر لتقرير يومي على Slack
1. تثبيت GoAccess
# على Ubuntu أو Debian
sudo apt update && sudo apt install goaccess -y
# على Alpine (مفيد جوا Docker)
apk add goaccess
# تأكد من الإصدار
goaccess --version
# المتوقع: GoAccess - 1.9.x2. ظبط log_format في Nginx
# /etc/nginx/nginx.conf داخل http {}
log_format combined_time '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time';
access_log /var/log/nginx/access.log combined_time;إضافة $request_time مهمة — هي اللي هتخليك تشوف أبطأ endpoints في التقرير.
3. سكربت توليد التقرير ورفعه على Slack
#!/usr/bin/env bash
# /usr/local/bin/daily-nginx-report.sh
set -euo pipefail
LOG_FILE="/var/log/nginx/access.log"
REPORT_DIR="/var/www/reports"
DATE=$(date +%Y-%m-%d)
REPORT="${REPORT_DIR}/nginx-${DATE}.html"
SLACK_WEBHOOK="${SLACK_WEBHOOK_URL:?set SLACK_WEBHOOK_URL}"
mkdir -p "$REPORT_DIR"
# ولّد تقرير HTML لآخر 24 ساعة
goaccess "$LOG_FILE" \
--log-format=COMBINED \
--date-format='%d/%b/%Y' \
--time-format='%H:%M:%S' \
-o "$REPORT"
# استخرج عدد الطلبات الإجمالي لإرفاقه في رسالة Slack
TOTAL=$(goaccess "$LOG_FILE" --log-format=COMBINED \
-o json 2>/dev/null | jq '.general.total_requests')
# ابعت إشعار Slack بمعلومات الملخص
curl -sS -X POST "$SLACK_WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{\"text\": \"تقرير Nginx ليوم ${DATE}: ${TOTAL} طلب. افتح التقرير: https://reports.example.com/nginx-${DATE}.html\"}"4. تشغيل السكربت كل ليلة عبر cron
# sudo crontab -e
0 1 * * * SLACK_WEBHOOK_URL=https://hooks.slack.com/services/XXX/YYY/ZZZ \
/usr/local/bin/daily-nginx-report.sh >> /var/log/nginx-report.log 2>&1أرقام حقيقية من سيرفر إنتاج
على سيرفر VPS بـ 4 vCPU و8GB RAM يستقبل 1.2 مليون طلب يوميًا وحجم access.log 180 ميجابايت:
- زمن توليد التقرير: 4.2 ثانية
- استهلاك RAM وقت التشغيل: حوالي 112 ميجابايت
- حجم ملف HTML الناتج: 380 كيلوبايت (قابل للضغط لـ 90 كيلوبايت بـ gzip)
- التكلفة الشهرية: 0 دولار — نفس السيرفر، مفيش أي infra إضافي
للمقارنة، نفس الحجم على Elastic Cloud الأساسي بيبدأ من 95 دولار شهريًا قبل storage وbandwidth.
الـ trade-offs مقابل ELK وLoki
GoAccess بيربح في تلات نقاط: السرعة، التكلفة، والبساطة. بيخسر في تلات نقاط تانية: البحث التفاعلي الحر (ad-hoc search)، التجميع عبر أكتر من سيرفر، والتنبيهات الفورية على الأحداث.
الافتراض إن عندك سيرفر واحد أو اتنين وعايز تعرف "اللي حصل إمبارح". في الحالة دي GoAccess كفاية. لو عندك 10 سيرفرات موزعة وعايز تبحث لوج من 3 شهور في ثواني لحل incident، هتحتاج Loki أو ELK حقيقي.
نقطة تانية مهمة: GoAccess في وضع الـ real-time بيحتاج يكون شغّال dumpshot فقط عند الطلب. مفيش alerting داخلي. لو عايز تنبيه على تخطي الـ 5xx فوق 2% في 5 دقائق، الـ stack ده مش هيكفيك.
متى لا تستخدم هذه الطريقة
ابعد عن GoAccess لو انطبق عليك أي من دول:
- بتحتاج real-time alerting على أخطاء 5xx أو latency spikes — استخدم Prometheus + Loki أو Datadog.
- لوجاتك متوزعة على 5 سيرفرات أو أكتر، وعايز view موحد — GoAccess هيتعبك في الدمج اليدوي.
- عندك compliance requirements بتستدعي الاحتفاظ باللوج الخام قابل للبحث 90 يوم أو أكتر — GoAccess هو aggregator، مش archive.
- محتاج dashboards تفاعلية لفرق مختلفة — Kibana أو Grafana أنسب.
الخطوة التالية
انسخ السكربت اللي فوق، عدّل SLACK_WEBHOOK_URL بالرابط بتاعك من Slack Apps، وشغّله يدويًا مرة واحدة للتأكد إن التقرير بيتولّد والرسالة بتوصل. بعدين حطّه في cron على الساعة 1 صباحًا. خلال 3 أيام هيكون عندك archive يومي مرتّب لتقارير GoAccess، وهتبدأ تشوف patterns في traffic مكنتش واخد بالك منها — خصوصًا bots اللي بتستنزف bandwidth من غير ما تظهر في Google Analytics.
المصادر
- GoAccess Official Manual — goaccess.io/man
- Nginx ngx_http_log_module — nginx.org/en/docs/http/ngx_http_log_module.html
- Slack Incoming Webhooks — api.slack.com/messaging/webhooks
- Elastic Cloud Pricing — elastic.co/pricing
- Grafana Loki Documentation — grafana.com/docs/loki/latest