workerman外网访问失败主因是监听地址为127.0.0.1、防火墙未放行端口、云安全组未配置入方向规则;须将监听地址改为0.0.0.0,重启服务,并同步开放系统防火墙及云安全组对应端口。

Workerman部署后外网访问失败,不是代码没跑起来,而是请求根本没抵达服务进程——本地curl 127.0.0.1:2345能通,但用手机或另一台电脑访问服务器公网IP就超时或连接拒绝,这说明监听地址、防火墙、安全组三者中至少有一处卡死。
确认Workerman监听地址是否正确
打开你的启动文件(如start.php或server.php),找到类似$worker = new Worker('websocket://127.0.0.1:2346');或$gateway = new Gateway('text://127.0.0.1:5678');的行。
把127.0.0.1全部替换成0.0.0.0,例如:new Worker('websocket://0.0.0.0:2346')或new Gateway('tcp://0.0.0.0:5678')。
【必须完整重启,热重载不生效】执行php start.php stop && php start.php start,不要只reload或直接修改后刷新。
重启后立刻验证:运行ss -tuln | grep :2346(把2346换成你实际端口),输出中必须出现*:2346或0.0.0.0:2346;如果还显示127.0.0.1:2346,说明代码没生效或被其他配置覆盖。
检查系统级防火墙是否放行端口
CentOS 7+/Rocky/AlmaLinux默认启用firewalld,即使你关了它,也可能残留iptables规则。
先查当前开放端口:sudo firewall-cmd --list-ports,如果没看到你的端口(比如2346),就加进去:
sudo firewall-cmd --add-port=2346/tcp --permanent
sudo firewall-cmd --reload
如果firewall-cmd命令报错或不存在,说明firewalld没启用,此时要检查iptables:sudo iptables -L -n | grep 2346。若无放行规则,执行:sudo iptables -I INPUT -p tcp --dport 2346 -j ACCEPT → sudo service iptables save(CentOS 6)或sudo iptables-save > /etc/sysconfig/iptables(CentOS 7+)。
云服务器安全组必须手动添加入方向规则
阿里云、腾讯云、华为云、AWS等平台的安全组是独立于系统防火墙的第一道拦截,本地telnet通不代表外网能通——loopback流量根本不经过安全组。
登录云控制台 → 找到对应ECS实例 → 进入「安全组」→ 编辑「入方向规则」→ 添加一条新规则:
协议类型选TCP,端口范围填你的端口号(如2346,或2346-2350批量开放),源IPv4地址设为0.0.0.0/0(仅测试阶段)。
保存后等待10秒左右再测,安全组策略不是实时生效,有缓存延迟。
验证端口是否真正在监听且可被外部访问
在服务器上执行:curl -v http://127.0.0.1:2346,确认服务内部响应正常。
从局域网另一台机器(如你自己的笔记本)执行:telnet 你的服务器公网IP 2346,如果显示“Connected”,说明网络链路通;如果显示“Connection refused”,说明Workerman没监听0.0.0.0或进程根本没起来;如果卡住或超时,99%是安全组或防火墙没放行。
注意:Windows用户用PowerShell执行Test-NetConnection 你的IP -Port 2346更可靠,cmd里的telnet默认未启用。
排查低权限用户无法绑定端口的问题
如果你监听的是80、443这类低端口,而启动命令是普通用户执行的(如www-data、nginx、非root用户),Linux内核会静默拒绝绑定,Workerman可能假死或日志里只有Permission denied。
开发阶段直接换高端口:把0.0.0.0:80改成0.0.0.0:8080,彻底避开权限问题。
生产环境要用80/443?别让Workerman直连——用Nginx反向代理,Nginx以root身份启动并监听80,再把请求转发给Workerman的8080端口。











