适用场景

Nginx 出问题通常不是它慢,而是配置里的默认值不适合当前负载(连接数、缓冲区、超时),或者上游有问题而 Nginx 只是「背锅」。排障要先分清是 Nginx 自身、上游还是客户端链路。

配置步骤(访问控制与站点防护)

# 1) 基础防护
location ^~ /inc/ { return 404; }
location ~* ^/uploads/.*\.(php|php5|phtml|phar)$ { return 403; }

# 2) 限流
# 定义在 http 段:limit_req_zone $binary_remote_addr zone=api:10m rate=20r/s;
location /api/ {
    limit_req zone=api burst=40 nodelay;
    limit_req_status 429;
}

# 3) 限连接数与下载
# limit_conn_zone $binary_remote_addr zone=conn:10m;
# location /download/ { limit_conn conn 5; limit_rate 2m; }

# 4) 只允许内网访问后台(示例,结合真实客户端 IP)
# set_real_ip_from 172.16.1.254; real_ip_header X-Forwarded-For;
# location ^~ /admin/ { allow 172.16.0.0/16; allow <办公公网IP>; deny all; }

# 5) 校验
curl -s -o /dev/null -w '%{http_code}\n' -H 'Host: tfor.cn' http://127.0.0.1/inc/config.php

关键参数与建议

  • worker:worker_processes auto,worker_connections 按内存与并发评估
  • keepalive:到上游启用 keepalive 连接池,显著降低时延与端口消耗
  • 超时:client/upstream 读写超时按业务设,避免默认 60s 导致请求堆积
  • 缓冲:proxy_buffering 与 buffer 大小按响应体大小调,SSE/大文件要单独处理
  • HTTPS:会话缓存、协议版本、证书链完整;到期前自动续期并有告警
  • 限流与防护:limit_req/limit_conn 防突发,上传目录禁执行
  • 日志:访问日志含上游耗时($upstream_response_time)便于定位
  • 诊断:nginx -T 看最终配置、stub_status 看连接状态、error_log 找线索

容易踩的坑

  • 上传目录允许执行 PHP,被上传 webshell
  • 没有限流,被爬虫或攻击打满连接
  • 后台没有来源限制,公网随便试密码
  • real_ip 未配置,allow/deny 判断的是前置 IP,等于全放通
  • 限流阈值设太低,正常用户被 429
  • 只在前端限流,源站端口仍可直连绕过

验证与巡检

nginx -T | grep -E 'limit_req|limit_conn|allow|deny|real_ip_header'
curl -s -o /dev/null -w 'upload php -> %{http_code}\n' -H 'Host: tfor.cn' http://127.0.0.1/uploads/test.php

# 目标:敏感路径 404/403、限流生效、后台仅白名单可达
  • 巡检:敏感路径全拦、限流触发记录、后台访问日志仅白名单来源

小结

Nginx 运维验收:能说清当前并发上限、上游连接是否复用、超时配置依据,并能用日志把慢请求归因到上游或自身。

> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。