Nginx防DoS核心是控连接、限请求、堵异常:用limit_conn_module限单IP并发连接,limit_req_module限请求频率,原生指令拦截异常请求,并精简响应隐藏指纹。

直接用 Nginx 防 DoS,核心是“控连接、限请求、堵异常”,不依赖第三方工具也能建立有效防线。关键不在堆配置,而在按业务节奏设合理阈值,并配合基础安全加固。
限制单个 IP 的并发连接数
攻击者常通过大量短连接耗尽服务器 fd 或内存。Nginx 的 limit_conn_module 可精准控制:
- 在
http块中定义连接统计区域:limit_conn_zone $binary_remote_addr zone=perip:10m; - 在具体
location或server块中启用限制:limit_conn perip 15;(例如静态资源页设 15,API 接口可设 5–20) - 建议搭配日志提示:
limit_conn_log_level warn;limit_conn_status 429;(返回 429 而非默认 503,语义更明确)
控制单位时间内的请求频率
针对慢速或高频刷接口类 DoS(如 CC 攻击),用 limit_req_module 实现漏桶限流:
- 定义速率规则:
limit_req_zone $binary_remote_addr zone=reqip:10m rate=8r/s; - 应用到敏感路径:
location /api/ { limit_req zone=reqip burst=16 nodelay; } -
burst是缓冲窗口,nodelay表示超出后立即拒绝(不排队),适合防御型场景;若需平滑体验,可去掉nodelay让部分请求延迟处理
拦截明显异常的请求行为
很多 DoS 尝试从协议层就暴露破绽,Nginx 原生能力即可过滤:
- 只允许标准方法:
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$) { return 444; }(444 是静默关闭连接) - 限制请求头大小,防畸形包:
client_header_buffer_size 2k;large_client_header_buffers 4 4k; - 禁用 Range 头滥用(防 Range DoS):
max_ranges 10;
精简响应与隐藏指纹
减少攻击面本身也是防 DoS 的一环——避免因版本漏洞被针对性放大攻击:
- 关闭版本暴露:
server_tokens off; - 清除敏感响应头(需
ngx_headers_more模块):more_clear_headers "Server" "X-Powered-By"; - 禁止目录遍历和隐藏文件访问:
autoindex off;location ~ /\. { deny all; }











