在最近的一次系统监控中,发现服务器内存使用率突然飙升,导致服务响应变慢。经过排查发现是由于大量爬虫请求导致Nginx内存使用量激增。
现象观察:
根本原因:
在Nginx配置中添加爬虫User-Agent拦截:
map $http_user_agent $bad_bot {
default 0;
~*(googlebot|bingbot|YandexBot|Baiduspider|facebookexternalhit|Twitterbot|rogerbot|linkedinbot|embedly|quora|pinterest|slackbot|vkShare|W3C_Validator|python-requests|Go-http-client|Java|Apache-HttpClient|curl|libwww|scrapy|HttpClient) 1;
}
server {
# ...其他配置...
if ($bad_bot) {
return 403;
}
}
使用Nginx的limit_req模块限制单个IP的请求频率:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
# ...其他配置...
location / {
limit_req zone=one burst=20 nodelay;
# ...其他配置...
}
}
调整Nginx工作进程配置:
worker_processes auto; # 自动设置worker数量
worker_rlimit_nofile 65535; # 每个worker可打开的文件描述符数量
events {
worker_connections 4096; # 每个worker的最大连接数
multi_accept on; # 一次接受所有新连接
use epoll; # 使用高效的epoll事件模型
}
减少重复请求对后端的压力:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
server {
# ...其他配置...
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# ...其他配置...
}
}
添加专门的爬虫访问日志:
log_format bot_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
server {
# ...其他配置...
access_log /var/log/nginx/bot_access.log bot_log if=$bad_bot;
}
通过以上措施,有效解决了因爬虫导致的内存飙升问题,同时提升了网站的整体安全性和稳定性。