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

生产环境Docker部署的NestJS Socket.IO服务无法连接求助

问题核心原因

你的错误主要由三个配置问题共同导致:Apache代理规则顺序错误、NestJS网关未绑定容器可对外暴露的地址、Apache必要代理模块未启用。


步骤1:修正NestJS网关配置

容器内的服务必须绑定0.0.0.0才能接收宿主机转发的请求,修改app.gateway.ts的网关注解:

@WebSocketGateway({
  host: '0.0.0.0', // 新增此行,不要绑定默认的127.0.0.1
  transports: ['websocket', 'polling'],
  cors: {
    origin: '*',
    methods: ['GET', 'POST'],
  },
})
export class AppGateway

修改完成后重新构建Docker镜像再启动容器。

步骤2:修正Apache2配置

ProxyPass规则遵循先匹配更精确的路径、先配置WebSocket规则再配置普通HTTP规则的原则,原配置顺序错误导致WebSocket请求被普通HTTP规则拦截:

RewriteEngine On
# 优先处理polling模式的socket.io请求
RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=polling    [NC]
RewriteRule /(.*)           http://127.0.0.1:3000/$1 [P,L]

# WebSocket代理规则必须放在普通HTTP代理前面
ProxyPass /socket.io/ ws://127.0.0.1:3000/socket.io/
ProxyPassReverse /socket.io/ ws://127.0.0.1:3000/socket.io/

# 最后配置普通HTTP代理
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/

步骤3:启用Apache必要模块

Debian10默认不会开启所有需要的代理模块,执行以下命令启用:

a2enmod proxy proxy_http proxy_wstunnel rewrite

执行完成后重启Apache服务:

systemctl restart apache2

步骤4:验证连通性

先在服务器本地直接请求socket.io接口验证服务是否正常:

curl "http://127.0.0.1:3000/socket.io/?EIO=4&transport=polling"

正常会返回非404的响应,再从客户端测试连接即可。


内容的提问来源于stack exchange,提问作者Maxi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:45:03