بعد أي حادثة يكون في سجلّ الوصول كلّ شيء: ما طُلب، ومتى، ومن أين، وبماذا ردّ الخادم. المشكلة ليست قلّة البيانات بل مليون سطر منها. هذه الأوامر تختصرها.
مَن أكثر مَن يطلب
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
وماذا طلب
sudo grep " 203.0.113.42 " /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -30
المسح الآليّ ظاهر في هذه القائمة: عشرات المسارات، كلٌّ منها مرّة واحدة، وأغلبها 404. والإنسان المتصفّح لا يشبه هذا إطلاقًا.
وما الذي نجح — وهو السؤال الحقيقي
sudo awk '$9 ~ /^(200|301|302)$/ {print $1, $7}' /var/log/nginx/access.log \
| grep -E 'wp-login|xmlrpc|/admin|\.php' | sort | uniq -c | sort -rn | head -20
جدارٌ من 404 ضجيج. أمّا 200 على مسار لا تعرفه فهو السطر الذي تقف عنده — وخصوصًا POST إلى ملف داخل مجلّد الرفع.
طلبات POST وحدها
sudo awk '$6 ~ /POST/ {print $1, $7, $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
ومتى حدث
sudo grep "203.0.113.42" /var/log/nginx/access.log | awk -F'[\\[\\]]' '{print $2}' | cut -d: -f1-2 | uniq -c
وشكل رفعٍ نجح
sudo awk '$7 ~ /uploads/ && $9 == 200 {print}' /var/log/nginx/access.log | grep -i '\.php' | head
انسخ السجلّات إلى مكان آخر قبل أن تبدأ. التدوير يعمل، وخادمٌ مزدحم قد يمحو الدليل خلال يوم — وهو غالبًا اليوم الذي تكتشف فيه ما كنت تبحث عنه.