Workerman启动后netstat查不到监听端口且报“Connection refused”,主因是监听地址写死为127.0.0.1,须全部改为0.0.0.0并完整重启;其次排查端口占用、防火墙/安全组双层拦截、低权限用户绑定低端口失败及Windows下pcntl扩展缺失问题。

Workerman启动后netstat查不到监听端口,telnet测试直接拒绝连接,客户端反复报“Connection refused”,不是代码没写,是进程根本没把端口真正挂上去。
监听地址写死为127.0.0.1
检查所有Worker或Gateway实例的构造参数,比如new Worker('tcp://127.0.0.1:2345')或new Gateway('websocket://127.0.0.1:8080')——这会导致只响应本机回环请求,外部设备发包到服务器真实IP时内核直接丢弃。
必须全局改为0.0.0.0:用new Worker('tcp://0.0.0.0:2345')或new Gateway('websocket://0.0.0.0:8080')。
改完不能只执行php start.php reload,热重载不生效,【必须完整重启】:php start.php stop && php start.php start。
重启后立刻验证:ss -tuln | grep :2345。若输出中仍是127.0.0.1:2345,说明代码未生效或被其他配置覆盖(比如环境变量、配置文件、多Worker实例中某一个仍写死127.0.0.1)。
端口被系统其他进程占用
方法一:用netstat -tulnp | grep :2345(Linux)或netstat -ano | findstr :2345(Windows)查占用进程PID。
方法二:用lsof -i :2345(macOS/Linux),若提示command not found,先yum install -y lsof或apt install -y lsof。
确认是其他服务占用了,就停掉它;如果是Workerman旧进程残留(比如kill -9后pid文件未清理),直接杀进程:kill -9 $(cat /path/to/workerman.pid),再删pid文件。
防火墙或云安全组拦截端口
第一步:在服务器上执行telnet 127.0.0.1 2345——通了不代表外网能连,loopback流量不经过firewalld/云安全组。
第二步:查当前开放端口:sudo firewall-cmd --list-ports(CentOS 7+/AlmaLinux)或sudo ufw status(Ubuntu)。
第三步:临时放行测试:sudo firewall-cmd --add-port=2345/tcp --permanent && sudo firewall-cmd --reload。
第四步:登录阿里云/腾讯云控制台 → 找到对应ECS → 安全组 → 入方向规则 → 添加TCP协议、端口2345、授权对象0.0.0.0/0(测试用)。
注意:安全组和系统防火墙要**双层都放行**,漏一层,连接就卡在半路。
低权限用户尝试绑定1024以下端口
Linux下,普通用户无法绑定80、443等低端口,会静默失败或报Permission denied,Workerman进程可能假死、不报错、也不监听。
验证方式:ps aux | grep start.php看是否真在运行;再tail -f storage/logs/workerman.log查有无权限错误日志。
解决方案只有两个:【要么切root用户启动】,要么把端口改成1024以上(如8080、2345、7272)。
Windows下pcntl扩展缺失或兼容问题
Windows原生不支持pcntl,若你用的是标准workerman而非workerman-for-win,启动时会报Fatal error: Call to undefined function Workerman\Lib\pcntl_signal(),进程直接退出,自然无监听。
正确做法:删掉vendor/workerman/workerman目录,改用composer require workerman/workerman-for-win安装专用版。
装完后别忘了在启动脚本开头加define('GLOBAL_START', true);,否则Win版自动加载机制不触发。

















