Với case nhiều site chung VPS (Nginx + PHP 7.4) ví dụ như vậy và mỗi domain có access.log riêng mà không biết thằng nào đang bị crawl/DDOS thì làm theo cách dưới đây — ưu tiên xử lý nhanh, dùng command line vì bạn thích headless mode 👍
for f in /var/log/nginx/*access.log; do echo "==== $f ===="; wc -l $f; done | sort -k2 -nr
👉 File nào tăng dòng nhanh nhất → domain đó đang bị spam/crawl.
watch -n 2 'for f in /var/log/nginx/*access.log; do echo -n "$f "; wc -l < $f; done | sort -k2 -nr'
Chạy cái này 1–2 phút là biết domain nào tăng mạnh.
Ví dụ với 1 domain:
awk '{print $1}' domain.com.access.log | sort | uniq -c | sort -nr | head -20
👉 Nếu 1 IP chiếm hàng nghìn request → khả năng DDOS.
awk -F\" '{print $6}' domain.com.access.log | sort | uniq -c | sort -nr | head -20
Nếu thấy:
curlpythonAhrefsBotSemrushBotMJ12botBytespider→ bot crawl.
grep "wp-login" domain.com.access.log | wc -l grep "xmlrpc.php" domain.com.access.log | wc -l grep "?s=" domain.com.access.log | wc -l
top
Nếu thấy:
Tiếp:
netstat -an | grep :80 | wc -l
Nếu connection > vài nghìn → có thể đang bị flood.
Nếu bạn dùng chung log (có $host trong format), chạy:
awk '{print $1,$7,$12}' access.log | sort | uniq -c | sort -nr | head
Hoặc đếm theo host:
awk '{print $1,$12}' access.log | sort | uniq -c | sort -nr | head
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
Trong server block:
limit_req zone=one burst=20 nodelay;
Tự block IP spam.
Trong từng server block:
access_log /var/log/nginx/domain.com.access.log;
watch đếm dòng logsudo iptables -A INPUT -s IP_ADDRESS -j DROP