Nginx 反代与 WebSocket 常见坑排查清单

这篇是工程型排障清单:遇到 WS 连不上时按这个顺序查,基本能定位到问题点。

先给结论

WebSocket 不通,99% 不是"框架坏了",而是以下三类问题:

  1. 路径错了 / 被路由接管
  2. Upgrade 头没传进去
  3. 权限或跨域拦截

一、排查顺序(强烈建议按这个来)

  1. 确认访问路径是否命中后端
  2. 确认 Nginx 是否走了 WebSocket location
  3. 确认 Upgrade/Connection 头是否正确
  4. 确认后端握手是否返回 101
  5. 确认权限/登录态是否带上

二、最稳的 Nginx WebSocket 配置模板

nginx 复制代码
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

location /ws/ {
    proxy_pass http://127.0.0.1:8123/ws/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    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_read_timeout 3600s;
    proxy_send_timeout 3600s;
    proxy_buffering off;
}

三、最常见的 6 个坑

1) location 被 /api/ 抢走

如果 WebSocket 路径是 /api/ws/...,必须有专用 location:

nginx 复制代码
location /api/ws/ { ... }

并且放在 /api/ 前面。


2) proxy_pass 路径写错

复制代码
location /api/ws/ {
    proxy_pass http://127.0.0.1:8123/ws/;
}

上面会把 /api/ws/xxx 改成 /ws/xxx,后端 404。

正确写法:

复制代码
proxy_pass http://127.0.0.1:8123;

3) 没有 Upgrade 头

没有这两行基本没戏:

复制代码
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

WebSocket 也是握手 HTTP,如果依赖登录态:

  • 要保证 Cookie 能带上
  • 或直接 query 传 token

5) 后端返回 404/500

如果后端直接 404,说明路径没命中。

如果后端 500,多半是拦截器/权限校验失败。


6) http 与 https 混用

主站是 https 时,WebSocket 必须用 wss://,

否则浏览器会直接拦截。


四、快速自检命令

bash 复制代码
curl -i -N \
  -H "Connection: Upgrade" \
  -H "Upgrade: websocket" \
  "http://127.0.0.1:8123/ws/app/edit"

看到 101 Switching Protocols 才算后端 OK。


最后总结

排 WebSocket 先别猜,按"路径 → 头 → 状态码"三步走,

基本能在 5 分钟内定位问题。

相关推荐
木头左11 小时前
【Nginx】内网服务源 IP 白名单实战:动态域名解析放行网段 + 端口接管零改造
运维·nginx·白名单·反向代理
skywalk816312 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
没差c20 小时前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar
Lsetea3 天前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
guizhoumen4 天前
net core下WebSocket请求总是断开的解决方案
网络·websocket·网络协议
枫叶轻语5 天前
【Nginx 从入门到实战 09】前后端统一入口:部署页面与接口的完整配置
nginx·全栈
无言听风雨丶5 天前
Nginx 深度实战:从架构原理到生产排错
运维·nginx·架构
xxwl5855 天前
Nginx 基础学习笔记
笔记·学习·nginx
fb_123455 天前
K8s StatefulSet五大有状态集群实战_Nginx_Etcd_Redis_Cassandra_MySQL
nginx·kubernetes·etcd
acd120095 天前
域名解析缓存带来的隐性故障,很多排查都漏掉了这一层
java·运维·nginx