斜杠的玄学
规则只有一句话:proxy_pass 带 URI 就替换 location 部分,不带就原样拼接。四个例子对照着记:
location /api/ {
proxy_pass http://backend; # ① 不带 URI
# 请求 /api/user → 后端收到 /api/user(原样拼接)
proxy_pass http://backend/; # ② 带根 URI
# 请求 /api/user → 后端收到 //user(/api/ 被替换成 /)
# 注意双斜杠:location 是 /api/(带尾斜杠)时的经典坑
proxy_pass http://backend/v2; # ③ 带前缀 URI
# 请求 /api/user → 后端收到 /v2user—— /api/ 被替换成 /v2
proxy_pass http://backend/v2/; # ④
# 请求 /api/user → 后端收到 /v2/user —— 常见的"路径改写"用法
}实践建议:后端有 context-path 就用 ①,想剥掉前缀就用 ④,②③这种"半带"写法十次有九次是事故现场。拿不准就在后端加个日志看收到的真实路径,一分钟的事。
传递真实信息
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host; # 保留原始域名
proxy_set_header X-Real-IP $remote_addr; # 客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 原始协议 http/https
}
# 不配 Host:后端拿到的 Host 是 upstream 名,按域名路由的路由全乱
# 不配 X-Real-IP:后端日志里所有请求都来自 Nginx 的 IP
# 限流、风控、审计全部失灵——这是上 Nginx 后的头号必配项
# X-Forwarded-For 是链式的:经过的每一跳追加自己的来源超时三兄弟
proxy_connect_timeout(和后端建连的等待,默认 60s,内网 3~5s 够了)、proxy_send_timeout(发请求给后端)、proxy_read_timeout(等后端响应,默认 60s)。接口一慢就全局调大 read_timeout 是反模式——会把后端慢的问题掩盖成 Nginx 层的堆积。正确姿势:默认 60s 兜底,个别长接口单独在对应 location 里调大,短平快的接口反而要调小(快速失败)。
502 与 504 的分诊
报 502 Bad Gateway:后端拒绝连接或直接挂了——查后端进程、监听端口、防火墙;报 504 Gateway Timeout:后端活着但响应超时——查后端慢查询、线程池排队、read_timeout 配置。一个是"叫不应",一个是"回话慢",排查方向完全不同。后端有多台机器怎么分流量?下一篇:负载均衡。
评论 (0)