Nginx无真正“一键开启最高安全模式”,需提前配置限流、连接控制、黑白名单三类模块并reload;攻击时通过符号链接切换预设的应急配置实现“准一键”切换,再配合分级防护与自动响应机制提升实效性。

没有真正意义上的“一键开启最高安全模式”,Nginx 本身不提供预设的“安全等级开关”。所谓“最高安全模式”是根据攻击特征动态组合限流、连接控制、行为拦截与人机验证的策略集,需提前配置、按需启用,而非临时触发。
提前配置好三类核心防护模块
所有策略必须在攻击发生前写入配置并 reload,否则无法即时生效。重点不是“开”,而是“备好即用”:
-
速率限制(limit_req):针对高频请求,在 http 块中定义多个 zone,例如:
limit_req_zone $binary_remote_addr zone=aggressive:10m rate=2r/s; # 极严模式
limit_req_zone $binary_remote_addr zone=normal:10m rate=10r/s; # 常规模式 -
连接数限制(limit_conn):防连接耗尽,同样预设多档:
limit_conn_zone $binary_remote_addr zone=conn_high:10m; # 高强度连接限制区 -
IP 黑名单/白名单机制:用
geo+map或外部文件实现快速切换黑白名单逻辑,例如:
geo $blocked_ip { default 0; include /etc/nginx/conf.d/blocklist.conf; }
后续可在 location 中通过if ($blocked_ip) { return 444; }快速拦截。
攻击来临时的“准一键”切换操作
所谓“一键”,实为执行一条命令 reload 已准备好的高防护配置,前提是已存在两套配置文件:
- 日常配置:
/etc/nginx/sites-enabled/default - 应急高防护配置:
/etc/nginx/sites-enabled/default.emergency(含更严 limit_req、limit_conn、error_page 跳转验证码等) - 执行命令切换:
ln -sf /etc/nginx/sites-enabled/default.emergency /etc/nginx/sites-enabled/default && nginx -s reload
对关键路径做分级防护,避免全局锁死
不要对整个 server 块启用最严策略,而是按风险等级精准施加:
- 登录页(/login):rate=1r/s + burst=3 + nodelay,超限返回 429 或跳验证码页
-
API 接口(/api/):rate=5r/s + burst=10,配合
limit_conn conn_high 2 - 静态资源(.js/.css/.png):可放宽至 rate=50r/s,或关闭日志减少开销
- 首页(/):建议加简单 UA+Referer 校验,或嵌入 Turnstile 验证入口,仅对异常流量触发
配合日志与自动响应提升实战性
光靠静态配置不够,需让防护“活起来”:
- 开启 Nginx stub_status,用脚本每分钟统计 429 请求 IP,自动写入 blocklist.conf 并 reload
- 在 error_page 429 中返回轻量 HTML 页面,内嵌 Cloudflare Turnstile 或 hCaptcha,验证通过后发放临时 token,Nginx 用
map解析 token 并放行 - 将 access_log 格式扩展记录 $request_time、$upstream_response_time、$status,便于快速识别慢请求和攻击源


















