ERR_CONNECTION_REFUSED 错误源于本地 Web 服务未运行、穿透客户端配置端口不匹配、远端中继服务未监听或防火墙拦截,需依次验证服务进程、端口一致性、server 状态及网络连通性。

phpEnv 本身不报 Connection refused,这个错误一定来自你配置的穿透服务或目标服务本身。 它不是 phpEnv 的 bug,而是你本地启动的服务(比如 Apache/PHP 内置服务器)没起来,或穿透客户端没连上远端中继服务器,或远端中继服务根本没在监听指定端口。
确认本地 Web 服务是否真实运行
phpEnv 只是环境管理器,它不自动启动 Web 服务。你必须手动启动,否则穿透客户端连的是“空地址”。
- 执行
php -S 127.0.0.1:8000启动内置服务器时,终端必须保持运行状态;关掉终端就等于停服 - 用 phpEnv 启动 Apache 后,要验证进程是否存在:
ps aux | grep httpd(Linux/macOS)或任务管理器里搜httpd.exe(Windows) - 浏览器直接访问
http://127.0.0.1:8000或http://localhost:80,能打开才说明服务真活了;打不开就别急着配穿透
检查 frp/nps 客户端配置中的 local_port 是否匹配本地服务端口
这是最常踩的坑:本地服务监听 8000,但配置里写成 local_port = 8080,客户端就会向一个没人监听的端口发请求,自然被拒绝。
- frp 客户端配置段里,
local_port必须和你实际启动的 PHP/Apache 端口完全一致 - nps 客户端的
target字段格式为127.0.0.1:8000,不能漏掉 IP 或写错冒号 - 改完配置后,必须重启客户端进程,
systemctl restart frpc或杀掉旧进程再跑新命令
验证穿透服务端(server)是否正常接受连接
内网穿透是两端协作:client 把流量送出去,server 得接得住。server 挂了、防火墙拦了、token 错了,都会让 client 收到 Connection refused。
立即学习“PHP免费学习笔记(深入)”;
- 登录服务器,检查服务进程:frp 用
ps aux | grep frps,nps 用ps aux | grep nps - 确认 server 监听的是公网 IP 或
0.0.0.0,而不是仅127.0.0.1(后者只能本机连) - 检查云服务器安全组/防火墙:确保
server_port(如 7000)对公网开放,且协议是 TCP - 核对 client 配置里的
token和 server 配置文件中auth_token是否一字不差(大小写敏感)
用 telnet 或 nc 快速定位断点在哪一环
别靠猜,用底层工具直连测试,30 秒就能分清是 client 连不上 server,还是 server 连不上你的 local_port。
- 在本地机器上执行:
telnet your-server-ip 7000(frp 的 server_port)→ 如果通,说明 client 到 server 链路 OK;如果 Connection refused,问题出在 server 端或网络策略 - 在服务器上执行:
telnet 127.0.0.1 8000→ 如果不通,说明你本地服务根本没起来,或没绑定到 127.0.0.1 - 在服务器上执行:
nc -zv 127.0.0.1 8000(Linux/macOS)或下载ncat.exe(Windows)做同样测试
真正卡住的地方,往往不是配置写错了,而是某处进程没拉起来、某个端口被系统级防火墙静默丢包、或者 token 复制时多了一个不可见空格。每次改完,只动一个变量,然后用 telnet 验证,比反复重启整个链路更省时间。



















