必须开放代码中显式监听的端口,如new worker("websocket://0.0.0.0:2828")则开2828,且监听地址须为0.0.0.0;阿里云安全组需在【安全组→配置规则】中添加tcp协议、端口范围2828/2828、授权对象0.0.0.0/0,并同步放行系统防火墙。

Workerman 本身不强制绑定特定端口,但实际部署中必须开放你代码里 new Worker("text://0.0.0.0:端口号") 或 new Gateway("websocket://0.0.0.0:端口号") 显式监听的端口——没监听的端口开了也没用,监听了但没开就必然连不上。
哪些端口必须开?看你的启动配置,不是看“默认值”
很多人翻文档看到“常用端口 2345/8282/7272”,就一股脑全开,其实完全没必要。真正要开的,只取决于你项目里实际写的监听地址:
-
new Worker("websocket://0.0.0.0:2828")→ 必须开2828 -
$gateway = new Gateway("websocket://0.0.0.0:8282")→ 必须开8282 -
$register = new Register('text://0.0.0.0:1236')→ 必须开1236(GatewayWorker 场景) -
new Channel('text://0.0.0.0:2207')→ 必须开2207(如用到 Channel 组件)
注意:如果监听的是 127.0.0.1:8282,那外网永远连不上——0.0.0.0 才代表允许外部访问。用 netstat -tuln | grep :端口号 确认监听地址是否为 0.0.0.0,不是则改代码再重启。
阿里云安全组规则怎么填才生效
安全组不是“加个端口号”就行,格式和位置错一个就白配:
- 入口必须进【安全组】→【配置规则】,不是在实例页点“更多→网络和安全组”(那个已逐步下线)
- 协议类型选
TCP(Workerman 默认不用 UDP) - 端口范围必须写成
2828/2828或8282/8282,不能只写2828—— 阿里云后端校验严格,少斜杠直接保存失败 - 授权对象填
0.0.0.0/0(测试期)或精确 IP 段(如203.107.128.0/20),别填单个 IP 加/32,容易手误漏掉 - 规则加完不用重启 ECS,但建议等 10 秒再测,避免控制台缓存延迟
系统防火墙(firewalld / ufw)也得同步放行
安全组开了 ≠ 能通。CentOS/Alibaba Cloud Linux 默认启 firewalld,Ubuntu 默认启 ufw,它们在内核层拦截,请求根本到不了 Workerman 进程:
- 查状态:
sudo firewall-cmd --state(输出running表示开着) - 放端口(以
2828为例):sudo firewall-cmd --zone=public --add-port=2828/tcp --permanent→sudo firewall-cmd --reload - 验证:
sudo firewall-cmd --query-port=2828/tcp返回yes才算成功 - 特别注意:有些 CentOS 7 机器
firewalld关了,但iptables还在跑(systemctl status iptables查),得手动清规则或停服务
WSS(HTTPS+WebSocket)场景要额外注意 443
小程序、Vue 前端走 wss:// 协议时,流量先打到 Nginx 或直接由 Workerman 的 SSL 模式处理:
- 若用 Nginx 反代 WebSocket(推荐),Nginx 监听
443,Workerman 可继续用非加密端口(如2828),此时只需开443(安全组 + 系统防火墙) - 若 Workerman 自己加载证书跑
wss://0.0.0.0:443,那它就必须监听443,且需 root 权限启动;同时安全组和系统防火墙都要开443—— 注意:普通用户无法 bind 1024 以下端口 - 别忘了证书路径、SSL 配置项(如
context数组里的ssl_cert_file)必须真实存在且可读,否则start.php启动直接报错退出
最容易被忽略的是:同一台服务器多个 Workerman 实例共用一个安全组时,改规则会影响其他服务;而 firewalld 和 iptables 共存又没统一关,排查时会反复以为是配置错了,其实是两层防火墙叠着拦。











