连载中 4/15

反向代理:proxy_pass 结尾的斜杠是两个世界

2026-09-24 · 12 阅读 · 0 评论 · 0 赞

斜杠的玄学

规则只有一句话: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 配置。一个是"叫不应",一个是"回话慢",排查方向完全不同。后端有多台机器怎么分流量?下一篇:负载均衡。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#反向代理#proxy_pass#X-Forwarded-For#超时配置#502排查

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10101 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9873 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9294 阅读 · 21 评论 · 287 赞