Nginx 不具备智能识别异常请求的能力,但可通过限流、参数与路径过滤、协议校验等机制主动拦截或丢弃非法请求;核心是定义合法边界,越界即拒或限,如用 limit_req 控制速率、if+return 阻断恶意参数、deny 封禁敏感路径、client_body_timeout 丢弃 GET 请求体,并结合 geo/map 动态黑名单与协议合规检查实现纵深防护。

Nginx 本身不提供“自动识别并丢弃非正常请求”的智能引擎,但可通过组合限流、过滤、协议合规检查等机制,实现对高频、非法、无效请求的主动拦截或静默丢弃。核心不是“识别异常”,而是定义合法边界,越界即拒或限。
限流压制高频请求
对单位时间内的请求频次设硬性上限,超出即拒绝(非排队),适用于刷量、扫描、爆破类流量。
-
使用
limit_req模块按 IP 或 URL 路径控制速率:http { limit_req_zone $binary_remote_addr zone=burst:10m rate=5r/s; # 每秒最多5个请求 limit_req_zone $uri zone=api_limit:10m rate=10r/m; # 每分钟每个接口最多10次 server { location /api/ { limit_req zone=api_limit burst=5 nodelay; # 允许最多5个请求排队,超了直接503 } location /login { limit_req zone=burst burst=3 nodelay; # 登录页更严格,超限立即拒绝 } } }nodelay表示不延迟响应,直接返回503 Service Temporarily Unavailable,相当于“丢弃”后续请求。
过滤非法参数与路径
用 if + return 在请求进入后端前终止处理,避免无效转发:
- 拒绝含非法字符或格式的参数:
location /search { if ($args ~ "(select|union|sleep|benchmark|<script)") { return 403; } if ($arg_id !~ ^[0-9]+$) { return 400; } proxy_pass http://backend; } - 拦截明显恶意路径(如扫描器常用路径):
location ~* \.(php|asp|jsp|cgi|sh)$ { deny all; } location ~* /(admin|wp-admin|phpmyadmin|\.git|\.svn) { return 403; }
丢弃无用请求体(减少资源消耗)
对 GET、HEAD 等本不该带 body 的请求,主动丢弃客户端误发的请求体,防止被利用为 DoS 手段:
- 在
location或server块中启用:location / { # GET/HEAD 请求不处理请求体 if ($request_method ~ ^(GET|HEAD)$) { client_body_timeout 0; client_max_body_size 0; } proxy_pass http://backend; }更底层的方式是模块调用
ngx_http_discard_request_body(),但配置层无需干预——只要不启用client_body_buffer_size或proxy_pass_request_body off,Nginx 在收到GET请求时默认不读取 body,即自然丢弃。
封禁已知恶意来源
结合日志分析与自动化工具(如 fail2ban),动态更新封禁列表:
- 手动封禁单个 IP:
location / { deny 192.168.10.55; deny 203.0.113.0/24; allow all; } - 生产环境建议用
geo+map实现高效黑名单匹配,避免大量deny指令拖慢解析。
启用协议合规检查
防止畸形请求耗尽连接或触发解析漏洞:
- 拒绝无 Host 头或非法 Host:
server { listen 80; server_name ""; return 444; # 直接关闭连接,不返回任何响应 } - 限制请求头大小和数量,防 slowloris 类攻击:
client_header_timeout 5; client_header_buffer_size 1k; large_client_header_buffers 4 4k;
不复杂但容易忽略


















