配反代看着简单,上线后各种诡异问题基本都出在这几个地方。
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

