核心原因是监听地址未绑定到公网接口,应将127.0.0.1改为0.0.0.0,并确认防火墙、安全组已放行端口,且netstat显示*:端口或0.0.0.0:端口,非127.0.0.1:端口。

Workerman主动推送信息在本地开发环境能成功、部署到服务器后却失败,核心原因是网络可达性与服务监听范围不匹配。本地用127.0.0.1测试时一切正常,但服务器上若仍监听127.0.0.1,外部请求根本无法抵达Workerman进程,推送请求直接被系统丢弃。
检查监听地址是否绑定到公网接口
打开Workerman启动文件(如start.php或start_gateway.php),定位到Worker实例创建语句,例如:$worker = new Worker('websocket://127.0.0.1:2346');。
将127.0.0.1明确改为0.0.0.0,使服务监听所有可用网卡接口:$worker = new Worker('websocket://0.0.0.0:2346');。
【必须修改】若保留127.0.0.1,即使域名解析正确、端口开放,请求也仅限本机内部通信,外部HTTP/WebSocket推送请求永远无法进入Workerman。
确认服务器防火墙及云平台安全组已放行端口
方法一:Linux系统使用命令检查iptables或firewalld规则,确保目标端口(如2121、2346等)的INPUT链允许访问:sudo iptables -L INPUT -n | grep :2121。
方法二:阿里云/腾讯云/华为云等平台,必须登录控制台,在「安全组」规则中添加入方向规则,协议类型选TCP,端口范围填具体端口号(如2121),源IP可设为0.0.0.0/0(测试阶段)或限定来源IP段。
注意:宝塔面板自带防火墙需单独开启对应端口,它与系统防火墙是两套独立机制,缺一不可。
验证服务是否真正监听在0.0.0.0上
第一步:重启Workerman服务,确保新配置生效:php start.php restart。
第二步:执行netstat -tuln | grep :2121(将2121替换为你实际使用的端口)。
第三步:观察输出结果中,该端口对应的Local Address列必须显示*:2121或0.0.0.0:2121,而非127.0.0.1:2121。
若显示127.0.0.1,说明代码未生效、服务未重启,或存在多个Worker实例冲突——此时需杀掉全部PHP进程再重试:pkill -f "php start.php"。
排查GatewayClient跨服务器通信配置
方法1:若使用GatewayClient从Web项目调用推送,确认Gateway::$registerAddress填写的是Register服务所在服务器的**真实内网IP**(非0.0.0.0,非127.0.0.1),且该IP能被当前Web服务器ping通。
方法2:检查start_register.php中$register->listen绑定地址,同样不能是127.0.0.1,应设为0.0.0.0:1236(端口以实际为准)。
【关键前提】GatewayWorker版本必须≥v3.0.22,否则跨公网通信会静默失败,无任何错误提示。











