You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx代理WebSocket时出现(111: Connection refused)错误求助

Nginx代理WebSocket时出现(111: Connection refused)错误求助

看起来你遇到的是Nginx代理Socket.io/WebSocket时的典型问题,别慌,我之前也帮朋友排查过类似的情况,咱们一步步来解决:

首先排查最常见的坑:npm服务的监听地址

很多人会忽略这个点:如果你的npm服务器代码里,监听的是localhost:30000,那这个服务只能在它自己的容器内部访问,Nginx容器(另一个独立容器)根本连不上,自然会报111连接拒绝的错误。

你可以这么验证:

  1. 进入你的npmServer容器:docker exec -it <你的npm容器ID/名称> sh
  2. 用ss -tulpn命令查看服务监听的地址,确保输出里是0.0.0.0:30000而不是127.0.0.1:30000
  3. 如果是后者,修改你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:34:30