Nginx代理WebSocket时连接总是断开,该怎么排查?

一彦会 阅读 20

我用Nginx做前端页面到后端WebSocket服务器的代理,但连接一直提示”WebSocket connection to ‘wss://example.com/socket’ failed: Error during WebSocket handshake: Unexpected response code: 400″。之前按照网上的教程配置了

在nginx.conf里写了这些配置:


location /socket/ {
    proxy_pass http://backend_server;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400;
}

前端用的是

new WebSocket('wss://example.com/socket')

但还是连不上,浏览器控制台显示400错误,后端日志也没有收到连接请求。试过重启Nginx和检查SSL配置都没用,是不是哪里没配全?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
W″志青
从你的描述来看,问题大概率出在Nginx的配置上。虽然你已经设置了proxy_http_version 1.1proxy_set_header相关的参数,但有几个地方容易被忽略,我一个个说。

首先确认一下后端WebSocket服务是否真的能正常运行。你可以用curl或者直接用浏览器访问后端的WebSocket地址(比如http://backend_server/socket),看看是不是能连上。如果后端本身有问题,那Nginx再怎么配也没用。

其次,检查一下Nginx的proxy_pass配置。你写的是proxy_pass http://backend_server;,这里的backend_server应该是一个具体的IP或域名,而不是随便起的名字。如果它是一个upstream定义的名称,确保你在Nginx配置文件里有对应的upstream块,类似这样:

upstream backend_server {
server 127.0.0.1:8080;
}


另外,proxy_read_timeout设置为86400秒是没问题的,但建议也加上proxy_send_timeout,防止发送数据时超时断开。可以加一行proxy_send_timeout 86400;

还有个常见的坑是SSL配置。你前端用的是wss://协议,说明需要HTTPS支持。确认Nginx的SSL证书配置正确,特别是证书链是否完整。可以用在线工具测试一下你的站点SSL配置有没有问题。如果证书有问题,浏览器会直接拒绝连接。

最后,安全方面提醒一下,别忘了在Nginx里限制WebSocket路径的访问来源,防止恶意请求。比如加上valid_referers或者更严格的IP白名单限制。示例配置如下:

location /socket/ {
proxy_pass http://backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_send_timeout 86400;
valid_referers none blocked example.com;
if ($invalid_referer) {
return 403;
}
}


如果这些都检查过了还是不行,试着把Nginx的日志级别调成debug,重新加载配置后看日志输出,可能会发现更多线索。调试完记得改回原来的日志级别,不然日志文件会疯长。

总之一步步排查:先确认后端服务正常,再检查Nginx配置是否遗漏关键项,最后关注SSL和安全性。希望这些建议能帮你解决问题。
点赞 1
2026-02-19 16:14
雨妍
雨妍 Lv1
这问题我遇到过,一般是Nginx配置或者后端WebSocket服务的问题。先确认几个点:你的后端WebSocket服务是不是正常运行,直接用wscat或者其他工具连一下后端地址看看通不通。

代码给你:


location /socket/ {
proxy_pass http://backend_server;
proxy_http_version 1.1;
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;

# WebSocket 相关配置
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400; # 超时时间设置长一点
proxy_send_timeout 86400;

# 如果后端需要其他自定义头信息可以在这里加上
# proxy_set_header Some-Header "value";
}


有几个关键点需要注意:
1. 确保proxy_pass的地址是正确的,比如后端WebSocket服务是不是监听了这个地址和端口。
2. 检查SSL配置,如果你用的是wss协议,必须确保Nginx的SSL证书配置正确,特别是证书链要完整,可以用在线工具测一下你的域名SSL是否正常。
3. 后端WebSocket服务可能对请求头有校验,比如Host头,所以加了proxy_set_header Host $host
4. proxy_read_timeoutproxy_send_timeout都调大一点,避免连接被Nginx提前断开。

如果还是不行,建议抓包看看,用tcpdump或者wireshark,看看握手阶段到底发生了什么。还有就是检查后端日志,确认是不是后端主动拒绝了请求。

最后吐槽一句,WebSocket这种东西配起来真够折腾的,尤其是代理层,稍不注意就各种坑。
点赞 3
2026-02-14 18:06