Nginx代理WebSocket时连接总是断开,该怎么排查?
我用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配置都没用,是不是哪里没配全?
proxy_http_version 1.1和proxy_set_header相关的参数,但有几个地方容易被忽略,我一个个说。首先确认一下后端WebSocket服务是否真的能正常运行。你可以用
curl或者直接用浏览器访问后端的WebSocket地址(比如http://backend_server/socket),看看是不是能连上。如果后端本身有问题,那Nginx再怎么配也没用。其次,检查一下Nginx的
proxy_pass配置。你写的是proxy_pass http://backend_server;,这里的backend_server应该是一个具体的IP或域名,而不是随便起的名字。如果它是一个upstream定义的名称,确保你在Nginx配置文件里有对应的upstream块,类似这样:另外,
proxy_read_timeout设置为86400秒是没问题的,但建议也加上proxy_send_timeout,防止发送数据时超时断开。可以加一行proxy_send_timeout 86400;。还有个常见的坑是SSL配置。你前端用的是
wss://协议,说明需要HTTPS支持。确认Nginx的SSL证书配置正确,特别是证书链是否完整。可以用在线工具测试一下你的站点SSL配置有没有问题。如果证书有问题,浏览器会直接拒绝连接。最后,安全方面提醒一下,别忘了在Nginx里限制WebSocket路径的访问来源,防止恶意请求。比如加上
valid_referers或者更严格的IP白名单限制。示例配置如下:如果这些都检查过了还是不行,试着把Nginx的日志级别调成
debug,重新加载配置后看日志输出,可能会发现更多线索。调试完记得改回原来的日志级别,不然日志文件会疯长。总之一步步排查:先确认后端服务正常,再检查Nginx配置是否遗漏关键项,最后关注SSL和安全性。希望这些建议能帮你解决问题。
wscat或者其他工具连一下后端地址看看通不通。代码给你:
有几个关键点需要注意:
1. 确保
proxy_pass的地址是正确的,比如后端WebSocket服务是不是监听了这个地址和端口。2. 检查SSL配置,如果你用的是
wss协议,必须确保Nginx的SSL证书配置正确,特别是证书链要完整,可以用在线工具测一下你的域名SSL是否正常。3. 后端WebSocket服务可能对请求头有校验,比如
Host头,所以加了proxy_set_header Host $host。4.
proxy_read_timeout和proxy_send_timeout都调大一点,避免连接被Nginx提前断开。如果还是不行,建议抓包看看,用
tcpdump或者wireshark,看看握手阶段到底发生了什么。还有就是检查后端日志,确认是不是后端主动拒绝了请求。最后吐槽一句,WebSocket这种东西配起来真够折腾的,尤其是代理层,稍不注意就各种坑。