📢 欢迎来到万事技术论坛!本站仅讨论合法编程技术话题,严禁外挂/作弊/黑产/盗版内容,违者封号。

精华Nginx 反向代理配置里最容易踩的 5 个坑

ops_wang 进阶会员

配反代看着简单,上线后各种诡异问题基本都出在这几个地方。

1. 忘了透传 Host 头

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;              # 不加这行
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

不加 Host,后端拿到的 Host 是 upstream 名(比如 backend),生成的绝对 URL、重定向地址全错。程序判断 https 也依赖 X-Forwarded-Proto,不然永远以为自己是 http,生成一堆 http 链接被浏览器拦截。

2. proxy_pass 末尾斜杠

这是最阴的一条,差一个 / 路径完全不同:

location /api/ {
    proxy_pass http://backend;      # 保留 /api/xxx
}
location /api/ {
    proxy_pass http://backend/;     # 替换成 /xxx,/api 前缀被吃掉
}

带 URI(末尾有 / 或路径)时,Nginx 会把 location 匹配部分替换掉。后端一直 404 就是这个原因。

3. 上传大文件 413

client_max_body_size 50m;

默认是 1m,报错是「Request Entity Too Large」。注意这个指令要放在 http/server/location 里才生效。

4. WebSocket 连不上

WebSocket 需要显式的 Upgrade 头:

location /ws/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
}

proxy_http_version 1.1 和 Connection "upgrade" 缺一不可,另外长连接要把读超时调大,否则 60 秒就被断开。

5. 超时设置太短

proxy_connect_timeout 5s;
proxy_send_timeout    60s;
proxy_read_timeout    60s;

慢接口(报表导出、AI 推理)要单独调大 proxy_read_timeout,不然用户看到的是 504,后端其实还在正常跑。

附:改完一定要先校验

nginx -t && nginx -s reload

直接 reload 不校验,配置有语法错误会让服务起不来。

楼主 · 2026-09-28 13:21 · 浏览 3
dba_zhou 进阶会员

proxy_pass 末尾斜杠那个真的是玄学,我们后端一直 404,加了斜杠才好,当时完全不知道为什么,今天终于明白了。

1楼 · 2026-09-28 13:21
登录 后即可参与回复。