workerman绑定0.0.0.0仍无法外网访问,主因是防火墙拦截、云安全组未放行端口或监听地址写法错误(如缺协议前缀、误用127.0.0.1);须同步确保协议正确(如websocket://0.0.0.0:1234)、安全组与系统防火墙均开放端口,并通过netstat或ss验证监听显示*:1234或0.0.0.0:1234。

Workerman服务绑定0.0.0.0后仍无法从外网访问,常见原因是防火墙拦截、云服务器安全组未放行端口、或监听地址写法错误导致实际绑定到127.0.0.1。必须确保协议前缀、端口开放、网络策略三者同时正确,缺一不可。
确认监听地址写法是否正确
第一步:检查Worker构造时的监听地址字符串,必须显式包含协议和完整IP,例如websocket://0.0.0.0:1234或http://0.0.0.0:2345。
第二步:禁止使用tcp://127.0.0.1:1234、0.0.0.0:1234(无协议)、127.0.0.1:1234这类写法——它们会强制绑定到回环地址或触发协议降级,外网请求直接被拒绝。
第三步:若用text://0.0.0.0:5678等自定义协议,同样需带协议前缀;否则Workerman默认按TCP裸连接处理,不启用端口复用机制,多进程下易报Address already in use。
检查云服务器安全组与本地防火墙
方法一:阿里云/腾讯云/AWS控制台中,找到对应ECS实例的安全组规则,添加入方向规则:协议类型选“全部”或指定TCP,端口范围填你监听的端口(如1234),源IP填0.0.0.0/0(允许所有IP)。
方法二:Linux服务器上执行sudo ufw status查看防火墙状态;若启用,运行sudo ufw allow 1234放行端口。CentOS 7+用firewall-cmd --permanent --add-port=1234/tcp再firewall-cmd --reload。
【关键前提】安全组和系统防火墙必须同时放行,只开一个无效。
验证监听是否真正绑定到0.0.0.0
在服务器终端执行:netstat -tuln | grep :1234(将1234替换为你实际端口)。
正确输出应含*:1234或0.0.0.0:1234字段;若显示127.0.0.1:1234,说明监听地址写错或被覆盖,服务仅响应本机请求。
这一步操作起来很简单,直接把命令粘贴进去回车就行。如果没装netstat,改用ss -tuln | grep :1234,效果相同。
排除PHP版本与reusePort配置冲突
第一步:运行php -v确认PHP版本。若≤7.0,必须设置$worker->count = 1,否则多进程监听同一端口必然失败。
第二步:若PHP≥7.0且需多进程,必须在创建内部Worker前设置$inner_worker->reusePort = true,否则第二个进程启动时会因端口已被占用而退出。
第三步:不要在onWorkerStart回调里重复调用$worker->listen()——这个方法只对当前Worker实例生效,重复调用不报错但无意义。











