Nginx代理WebSocket时出现(111: Connection refused)错误求助
Nginx代理WebSocket时出现(111: Connection refused)错误求助
看起来你遇到的是Nginx代理Socket.io/WebSocket时的典型问题,别慌,我之前也帮朋友排查过类似的情况,咱们一步步来解决:
首先排查最常见的坑:npm服务的监听地址
很多人会忽略这个点:如果你的npm服务器代码里,监听的是localhost:30000,那这个服务只能在它自己的容器内部访问,Nginx容器(另一个独立容器)根本连不上,自然会报111连接拒绝的错误。
你可以这么验证:
- 进入你的npmServer容器:
docker exec -it <你的npm容器ID/名称> sh - 用
ss -tulpn命令查看服务监听的地址,确保输出里是0.0.0.0:30000而不是127.0.0.1:30000 - 如果是后者,修改你的npm服务启动代码,把监听地址改成
0.0.0.0(比如Express里的app.listen(30000, '0.0.0.0'))
优化Nginx的Socket.io专属配置
虽然你已经加了WebSocket相关的请求头,但针对Socket.io的路径单独配置,再加上长连接超时设置,能解决大部分兼容性问题。修改你的Nginx配置如下:
server { listen 80; listen [::]:80; client_max_body_size 100M; gzip on; gzip_disable "MSIE [1-6]\."; gzip_comp_level 6; gzip_min_length 1024; gzip_buffers 16 8k; gzip_proxied any; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; # 这里补充你原本的所有gzip类型 # 专门处理Socket.io的请求 location /socket.io/ { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket核心头,注意这里用小写的upgrade更兼容 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 长连接超时设置,避免WebSocket被过早断开 proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; proxy_pass http://npmServer:30000; } # 处理静态内容和其他普通请求 location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://npmServer:30000; } }
验证Docker容器间的网络连通性
确保Nginx和npmServer容器在同一个Docker网络里:
- 默认情况下docker-compose会给所有服务创建一个专属网络,两个容器应该都在里面,但你可以用
docker network inspect <你的项目名>_default(项目名是docker-compose.yml所在目录的名字)查看容器列表,确认两个容器都在这个网络里。 - 也可以进入Nginx容器,直接测试连通性:
curl http://npmServer:30000/socket.io/?EIO=4&transport=polling,如果能返回类似0{"sid":"xxx","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}的内容,说明容器间通信没问题,问题就出在Nginx配置上;如果curl也报错,那还是回到第一步检查服务监听地址或者容器网络配置。
按照这个步骤排查,应该能解决你的问题~
备注:内容来源于stack exchange,提问作者Flotolk
相关产品推荐
相关产品推荐

