بعد أي حادثة يكون في سجلّ الوصول كلّ شيء: ما طُلب، ومتى، ومن أين، وبماذا ردّ الخادم. المشكلة ليست قلّة البيانات بل مليون سطر منها. هذه الأوامر تختصرها.

مَن أكثر مَن يطلب

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
انسخ السجلّات إلى مكان آخر قبل أن تبدأ. التدوير يعمل، وخادمٌ مزدحم قد يمحو الدليل خلال يوم — وهو غالبًا اليوم الذي تكتشف فيه ما كنت تبحث عنه.