适用场景
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 运维验收:能说清当前并发上限、上游连接是否复用、超时配置依据,并能用日志把慢请求归因到上游或自身。
> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。