Nginx 常见问题
常见问题
reload 会不会中断线上请求?
不会中断正在处理的请求,但会有极短的重连窗口。master 收到 reload 信号后启动新 worker,老 worker 进入「优雅退出」状态——不再接新连接,处理完手头的请求后退出。已经建立的长连接(WebSocket、SSE)由老 worker 继续持有直到超时或关闭。所以普通请求无感知,长连接服务会有一次重连,客户端需要实现自动重连。
为什么后端拿到的客户端 IP 是 127.0.0.1?
因为默认没有转发真实 IP。后端看到的 TCP 源地址永远是 Nginx 的地址。解决方法是补上 proxy_set_header X-Real-IP $remote_addr; 和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,并让后端框架信任这两个头。$proxy_add_x_forwarded_for 的行为是在已有的 X-Forwarded-For 后面追加当前客户端地址,所以经过多级代理后会形成一个 IP 链,取第一个才是真实客户端。注意:这两个头可以被客户端伪造,只有在你确信上游没有不可信代理时才可信任。
upstream 里某个后端挂了会怎样?
Nginx 开源版只有被动健康检查:某个后端连续失败次数达到 max_fails(默认 1),就在 fail_timeout(默认 10s)内不再把请求发给它,超时后重新尝试。所以故障切换有延迟,且期间用户会看到一部分 502。要主动探测、更平滑的摘除,需要 Nginx Plus 或第三方模块。
location 优先级怎么算?
规则是:= 精确匹配优先级最高;其次是 ^~ 前缀匹配(匹配上就不再试正则);再次是正则匹配(~ 区分大小写、~* 不区分),按配置文件里出现的先后顺序,第一个匹配上的生效;最后才是普通前缀匹配,且取最长的那一个。记不住就用 nginx -T 结合实测验证,别靠猜。
该用 Nginx 还是直接在应用里做这些事?
通用原则是:与业务无关的、对所有服务都一样的部分,放在 Nginx——TLS、gzip、静态文件、限流、访问日志、超时控制。而需要知道用户是谁、需要读数据库才能决定的逻辑,留在应用里。把鉴权、灰度规则按用户 ID 分流这类逻辑写进 Nginx 配置,短期内能跑,长期会变成没人敢改的配置泥潭。

