workerman报“address already in use”是端口被占的系统级冲突,需先清占用进程:1.用lsof -i :端口号(linux/macos)或netstat+tasklist(windows)定位;2.用pgrep/killall清理残留子进程;3.确保监听地址为0.0.0.0而非127.0.0.1;4.检查云平台安全组与系统防火墙。

Workerman 启动时提示 “Address already in use”(TCP端口被占用),不是代码问题,而是系统级端口冲突——必须先清掉占用者,否则改配置、换文件名都没用。
怎么快速定位是哪个进程占了你的 TCP 端口
Linux/macOS 直接运行:lsof -i :7272(把 7272 换成你实际报错的端口号)。它会同时查 IPv4 的 0.0.0.0:7272 和 IPv6 的 :::7272,不会漏掉隐藏进程。
如果提示 command not found:
- Alpine 镜像:运行
apk add lsof - Ubuntu/Debian:运行
apt install lsof - CentOS/RHEL:运行
yum install lsof或dnf install lsof
Windows 用户用两步:
-
netstat -ano | findstr :7272查 PID -
tasklist | findstr 12345(把12345换成上一步看到的 PID)确认进程名
为什么 kill 主进程后端口还在被占
Workerman 是多进程模型,主进程 fork 出多个 worker。异常退出(比如直接关终端、kill -9 主进程、断电)后,子进程可能仍在后台运行,继续霸占端口。
别只杀主进程,要一锅端:
- 先看残留:
ps aux | grep "start.php"或ps aux | grep YourAppPath - 精准清理:
kill -9 $(pgrep -f "YourAppPath/start.php") - 开发环境可临时加一行(生产禁用):
exec("killall -u $(whoami) php 2>/dev/null");放在start.php最开头
监听地址写成 127.0.0.1 会导致“看似没占,实则连不上”
很多人改了端口但没改监听地址,结果 netstat -tuln | grep 7272 看不到监听,却仍报 Address already in use——因为 127.0.0.1:7272 和 0.0.0.0:7272 是两个独立绑定,前者可能被其他服务(如本地调试的 Node 服务、MySQL、Redis)悄悄占着。
检查你的 Worker 初始化代码:
- 错:
new Worker("tcp://127.0.0.1:7272")—— 只绑本地回环,外网连不了,且容易和开发工具冲突 - 对:
new Worker("tcp://0.0.0.0:7272")—— 绑定所有接口,也方便排查是否真被占
如果确定要限制访问范围,用防火墙控制,别靠监听地址“假装安全”。
阿里云/腾讯云上端口“启动成功但连不通”的真实原因
即使 netstat 显示监听成功、lsof 查不到冲突,外网还是连不上——大概率卡在云平台安全组或系统防火墙。
必须同步检查三项:
- 阿里云安全组:入方向规则里是否添加了
TCP:7272/7272,授权对象是否为0.0.0.0/0(或你允许的 IP 段) - 系统防火墙:
sudo firewall-cmd --query-port=7272/tcp(返回yes才算放行) - Workerman 是否监听
0.0.0.0:用telnet your-server-ip 7272从另一台机器测,别只在本机curl 127.0.0.1:7272
最容易忽略的是:安全组规则改了,但没点【保存】;或者改错了实例绑定的安全组,而不是当前这台。











