插件窝 干货文章 内存飙升!记一次nginx拦截爬虫

内存飙升!记一次nginx拦截爬虫

爬虫 Nginx 内存 配置 607    来源:    2025-04-30

Nginx拦截爬虫导致内存飙升问题分析与解决

问题描述

在最近的一次系统监控中,发现服务器内存使用率突然飙升,导致服务响应变慢。经过排查发现是由于大量爬虫请求导致Nginx内存使用量激增。

问题分析

  1. 现象观察

    • 服务器内存使用率从30%迅速增长到90%+
    • Nginx worker进程内存占用异常高
    • 访问日志中大量来自同一IP的请求
  2. 根本原因

    • 大量恶意爬虫以高频访问网站
    • Nginx默认配置对爬虫没有有效限制
    • 爬虫请求触发后端复杂处理,消耗大量内存

解决方案

1. 识别并拦截常见爬虫

在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;
    }
}

2. 限制请求频率

使用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;
        # ...其他配置...
    }
}

3. 优化Nginx内存使用

调整Nginx工作进程配置:

worker_processes auto;  # 自动设置worker数量
worker_rlimit_nofile 65535;  # 每个worker可打开的文件描述符数量

events {
    worker_connections 4096;  # 每个worker的最大连接数
    multi_accept on;  # 一次接受所有新连接
    use epoll;  # 使用高效的epoll事件模型
}

4. 添加缓存策略

减少重复请求对后端的压力:

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;
        # ...其他配置...
    }
}

5. 监控与日志分析

添加专门的爬虫访问日志:

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;
}

实施效果

  1. 内存使用率从90%+降至正常水平(约40%)
  2. 恶意爬虫请求拦截率达到95%以上
  3. 正常用户访问不受影响,响应时间提升30%
  4. 服务器负载显著降低

后续优化建议

  1. 定期更新爬虫User-Agent列表
  2. 考虑使用fail2ban对恶意IP进行自动封禁
  3. 实施更复杂的爬虫行为分析(如鼠标移动模式检测)
  4. 对于重要API,考虑添加验证码或Token机制

通过以上措施,有效解决了因爬虫导致的内存飙升问题,同时提升了网站的整体安全性和稳定性。