Nginx反向代理WebSocket报上游连接被拒,请求错走端口问题咨询
问题根因与解决方案
根因分析
本次错误的核心是Nginx的location前缀匹配规则导致请求被转发到错误端口:
- 你配置的4000端口WebSocket规则仅匹配前缀为
/api2的请求,其余前缀的请求会被/api或者/规则匹配,转发到3000端口 - 错误日志中的
apisocket.io路径是因为location /api的proxy_pass后带了/api路径:当请求路径为/api/socket.io时,Nginx会把匹配到的/api替换为proxy_pass后的/api,再拼接剩余路径/socket.io,最终拼接成错误的/apisocket.io路径
修复方案
根据你的实际使用场景二选一即可:
方案1:修改前端请求路径(无需修改Nginx配置)
如果你的WebSocket服务部署在4000端口的/api2路径下,直接把前端WebSocket请求路径改为/api2/socket.io即可,请求会自动匹配到对应规则转发到4000端口。
方案2:新增Nginx匹配规则(无需修改前端代码)
如果你不想修改前端请求路径,在当前Nginx配置的server块中新增如下优先级更高的规则即可:
# 匹配所有socket.io相关请求,优先级高于普通前缀匹配 location ^~ /api/socket.io { proxy_pass http://localhost:4000; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; # Websocket适配配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; }
配置修改完成后,执行nginx -t检查语法是否正确,确认无误后执行nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者Ven Kumar
相关产品推荐
相关产品推荐

