502错误首要原因是后端服务未监听指定端口,需用ss -tlnp | grep :8080和ps aux | grep java等命令确认进程存在且端口绑定正确,否则nginx反向代理必失败。

后端服务没监听对端口,502就是必然结果
看到 502 Bad Gateway,第一反应不是改 Nginx 配置,而是确认后端进程是否真在监听你写的那个端口。宝塔反向代理里填的 http://127.0.0.1:8080,不代表 8080 就一定有服务在跑。
用这两条命令直接验证:
-
ss -tlnp | grep :8080—— 看有没有进程绑定该端口;没输出就说明服务根本没起来,或监听了别的地址(比如只绑192.168.x.x) -
ps aux | grep java或ps aux | grep node—— 确认进程是否存在,且启动参数里指定了正确的端口
常见坑:SpringBoot 默认监听 0.0.0.0:8080,但若配置了 server.address=127.0.0.1,就只能本机 curl 通,Nginx 却连不上——因为宝塔的 Nginx worker 进程默认以 www 用户运行,不属于严格意义的“本机回环”上下文。
Nginx add_header 不加 always,跨域头在 4xx/5xx 响应里全失效
前端报 CORS 错误,但后端明明没开 CORS,你加了 add_header Access-Control-Allow-Origin "*" 还是不行?大概率是漏了 always 参数。
原因:Nginx 默认只对 2xx 和 3xx 响应添加 add_header,而预检请求(OPTIONS)失败时返回的是 403/405,真实接口失败可能是 401/500,这些响应压根不带你的跨域头,浏览器直接拦截。
必须改成这样(在宝塔网站配置 → 反向代理 → 配置文件的 location 块内):
add_header 'Access-Control-Allow-Origin' '$http_origin' always; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
注意:$http_origin 要求前端发请求时带 Origin 头;如果写死域名,别用 * + Access-Control-Allow-Credentials: true 组合,浏览器会直接拒收。
代理路径带前缀(如 /api/),后端返回的 Location 或 Set-Cookie 仍含原始端口
你配了反向代理到 /api/ → http://localhost:8080/,但后端返回 302 重定向时跳到了 http://localhost:8080/login,或者 Set-Cookie 的 Path 是 /、Domain 是 localhost —— 浏览器会拒绝这些头,导致登录态丢失或跳转失败。
解决方式分两层:
- 后端层面:SpringBoot 加
server.forward-headers-strategy=framework,并确保 Nginx 透传X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Port、X-Forwarded-Prefix - Nginx 层面:在 proxy_pass 同级加这几行(宝塔配置文件里):
proxy_redirect off;proxy_cookie_path / "/api/";proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Forwarded-Proto $scheme;
特别提醒:proxy_cookie_path / "/api/" 是硬性要求,否则 Cookie 路径不匹配,前端发请求永远带不上登录态。
WSS 握手失败?Apache 默认不转发 Upgrade 和 Connection 头
如果你用的是宝塔里的 Apache(不是 Nginx),且代理目标是 WebSocket(wss://),那几乎可以确定是模块和指令缺失。Apache 不像 Nginx 那样默认支持协议升级。
必须手动检查并启用两个模块:
-
proxy_wstunnel_module(核心,处理 wss 升级) -
proxy_http_module(基础 HTTP 代理)
然后在宝塔生成的 Apache 配置文件(/www/server/panel/vhost/apache/your-domain.com.conf)里,把原来的 ProxyPass 改成:
ProxyPass /data-feed/ ws://localhost:8080/data-feed/ ProxyPassReverse /data-feed/ ws://localhost:8080/data-feed/ # 必须显式透传关键头 RequestHeader set Origin "https://your-frontend.com" ProxyPreserveHost On
没有 ProxyPreserveHost On 和显式 RequestHeader set Origin,后端可能因 Host 或 Origin 不匹配拒绝握手;而 ws:// 协议前缀必须小写,大写或 wss:// 会导致 Apache 直接报错。
最后强调一点:所有这些配置修改后,必须在宝塔面板里点「重载 Apache」,而不是只重启网站——模块加载和配置生效是两回事。








