是否必须开放9501端口取决于Swoole服务部署方式:直连需放行该端口;Nginx反代则只需开放80/443,9501可绑定127.0.0.1仅限本地通信。

要开,但不是“必须开 9501 端口”——关键看你怎么用 Swoole。
你启动的是 swoole_http_server 或 swoole_websocket_server?
这类服务默认监听 0.0.0.0:9501(或你指定的端口),外部请求直连 PHP 进程,不经过 Nginx/Apache。如果客户端(比如浏览器、curl、手机 App)要访问它,firewalld 必须放行对应端口:
firewall-cmd --zone=public --add-port=9501/tcp --permanentfirewall-cmd --reload
否则连接直接被拒绝,现象是 Connection refused 或超时,telnet 127.0.0.1 9501 成功但外网连不上,基本就是防火墙挡的。
你只用 swoole_server 做内部协程任务或 CLI 工具?
比如定时器、异步 MySQL 查询、Co::sleep()、或仅在本地调用 php server.php 测试逻辑——这种场景根本没网络暴露,防火墙完全不用动。Swoole 扩展本身加载和运行跟防火墙无关。
立即学习“PHP免费学习笔记(深入)”;
你用 Nginx 反向代理 Swoole HTTP Server?
这时客户端只连 Nginx 的 80/443,Nginx 再通过 fastcgi_pass 或 proxy_pass 转发到本地 127.0.0.1:9501。防火墙只需开放 80 和 443,9501 不需要对外暴露,甚至可以加 --bind=127.0.0.1:9501 绑定回环地址,更安全。
常见错误:开了端口但还是连不上
别急着查 Swoole 配置,先确认三件事:
- 执行
firewall-cmd --list-ports看 9501 是否真在列表里(--permanent后必须--reload) - 执行
ss -tlnp | grep :9501确认 PHP 进程确实在监听,且是0.0.0.0:9501而非127.0.0.1:9501 - 检查 SELinux 是否启用:
getenforce返回Enforcing时,可能拦截 socket bind,临时关闭测试:setenforce 0
防火墙配置容易被当成“一次性操作”,但 firewalld 规则重启后失效(除非用了 --permanent),这点很多人忽略。



















