لوجات 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;