Nginx 是防应用层 DDoS 的务实首道缓冲,非万能盾;通过分层策略实现连接限制(limit_conn)、请求速率控制(limit_req)、协议加固及日志驱动动态拦截。
Web 服务防 DDoS 攻击,Nginx 不是“万能盾”,而是最务实的第一道缓冲带。它无法替代高防IP或流量清洗中心,但对应用层攻击(如 HTTP Flood、CC 攻击)响应快、开销低、规则灵活——关键在于策略不堆砌,而要分层匹配真实业务节奏。
攻击者常维持大量空闲 TCP 连接,挤占服务器 fd 资源和 worker 进程。Nginx 的 limit_conn 模块直接控制并发连接上限,属于连接层防御。
limit_conn_zone $binary_remote_addr zone=perip:10m;(用二进制 IP 地址节省空间)limit_conn perip 8;(普通 Web 页面建议 5–10;API 接口可设为 20–50)limit_conn_log_level warn; 和 limit_conn_status 429;,让日志可追踪、状态码语义清晰单个连接内高频发包(如秒刷 100 次搜索接口)是 CC 攻击典型特征。limit_req 模块基于漏桶算法平滑处理,比简单拒绝更友好。
limit_req_zone $binary_remote_addr zone=reqps:10m rate=15r/s;(每秒 15 请求是多数动态页面的安全起点)limit_req zone=reqps burst=30 nodelay; 允许短时突发,避免误伤正常用户点击或前端重试location /search { limit_req zone=search_limit burst=5; }
很多攻击依赖畸形请求或非常规行为绕过基础限流。这部分不增加性能负担,但能过滤掉大量低级扫描和试探流量。
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$) { return 444; }(444 是 Nginx 特有“静默关闭”状态)client_header_buffer_size 2k; 和 large_client_header_buffers 4 4k; 防止 header 溢出攻击client_max_body_size 2m;(上传接口除外,需按业务单独放开)静态规则容易被绕过。把 Nginx 日志作为“攻击雷达”,配合简单脚本可实现轻量级动态黑名单。
deny xxx.xxx.xxx.xxx; 硬拦截,比限流更彻底