Windows 下 WSL2 运行 PHP-FPM 连接拒绝错误怎么处理?

文章导读
WSL2 下 PHP-FPM 报连接拒绝错误,通常是因为 PHP-FPM 服务未启动、监听地址配置错误,或 Windows 与 WSL2 之间的网络命名空间不一致导致。优先检查服务状态和监听协议,确保 Web 服务器与 PHP-FPM 使用相同的通信地址。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

WSL2 下 PHP-FPM 报连接拒绝错误,通常是因为 PHP-FPM 服务未启动、监听地址配置错误,或 Windows 与 WSL2 之间的网络命名空间不一致导致。优先检查服务状态和监听协议,确保 Web 服务器与 PHP-FPM 使用相同的通信地址。

先说结论:大多数连接拒绝错误源于 PHP-FPM 进程未运行或监听配置与 Web 服务器请求地址不匹配。

  • 先确认:PHP-FPM 服务状态是否为 active 且监听端口未被占用
  • 先处理:统一 Web 服务器与 PHP-FPM 的通信协议(TCP 或 Socket)及地址
  • 再验证:通过 telnet 或 curl 测试端口连通性并查看 PHP 错误日志

命令速用版

以下命令用于快速检查服务状态和监听端口,需在 WSL2 终端内执行:

# 启动 PHP-FPM 服务(根据发行版调整服务名)
sudo service php-fpm start
# 或
sudo systemctl start php-fpm

# 检查 9000 端口是否监听
sudo netstat -tlnp | grep 9000

# 测试本地连通性
curl -I http://127.0.0.1:9000

为什么会这样

连接拒绝错误本质是 TCP 握手失败,说明目标端口没有进程监听或防火墙拦截。

WSL2 使用虚拟化网络架构,拥有独立的网络命名空间。如果 Web 服务器(如 Nginx)运行在 Windows 主机,而 PHP-FPM 运行在 WSL2 内部,Windows 的 localhost 无法直接访问 WSL2 的 localhost。此外,PHP-FPM 默认配置可能使用 Unix Socket 而非 TCP 端口,若 Web 服务器配置为 TCP 连接,则会报连接拒绝。

分步处理

步骤 1:检查服务状态

在 WSL2 终端执行状态检查命令,确保进程存在。若服务未运行,启动后观察是否立即停止。

sudo service php-fpm status

步骤 2:核对监听配置

打开 PHP-FPM 配置文件(通常位于/etc/php/*/fpm/pool.d/www.conf),查找 listen 指令。

若 Web 服务器通过 TCP 连接,配置应为 IP 加端口,例如 listen = 127.0.0.1:9000。若通过 Socket 连接,配置应为文件路径,例如 listen = /run/php/php-fpm.sock。确保 Web 服务器配置与该项完全一致。

步骤 3:处理 Windows 与 WSL2 网络差异

Windows 下 WSL2 运行 PHP-FPM 连接拒绝错误怎么处理?

如果 Nginx 运行在 Windows 上,PHP-FPM 运行在 WSL2 上,不能直接使用 127.0.0.1。需获取 WSL2 的 IP 地址(使用 ip addr 命令),并将 Windows Nginx 的 upstream 地址改为该 IP。注意 WSL2 重启后 IP 可能变化,建议将 PHP-FPM 和 Web 服务器都部署在 WSL2 内部以避免网络隔离问题。

怎么验证是否生效

创建包含<?php phpinfo(); ?>的测试文件,通过浏览器访问。

若页面正常显示 PHP 信息,说明连接成功。若仍报错,查看 WSL2 内的 PHP-FPM 日志(通常位于/var/log/php-fpm.log 或/var/log/php/*/fpm.log),确认是否有 accept failed 或权限错误记录。

常见坑

Socket 权限不足:若使用 Unix Socket,确保 Web 服务器用户(如 www-data)对 socket 文件有读写权限,必要时调整 listen.owner 和 listen.group 配置。

防火墙拦截:Windows 防火墙可能阻止来自 WSL2 的网络请求,若必须跨系统通信,需在 Windows 防火墙中放行对应端口。

端口冲突:其他服务可能已占用 9000 端口,使用 netstat 命令确认端口占用情况,必要时更换 PHP-FPM 监听端口。

常见问题

WSL2 内 Nginx 连接 PHP-FPM 应该用 Socket 还是 TCP?

推荐在同一 WSL2 实例内使用 Unix Socket,性能略优且配置简单。

Windows 主机上的浏览器无法访问 WSL2 内的 PHP 页面怎么办?

确保 Web 服务器监听 0.0.0.0 而非 127.0.0.1,并在 Windows 防火墙允许 WSL2 相关应用通过网络。

PHP-FPM 启动后立即退出是怎么回事?

通常是配置文件语法错误导致,执行 sudo php-fpm -t 检查配置完整性。

参考来源

  • Microsoft Learn, "Networking in WSL", https://learn.microsoft.com/windows/wsl/networking
  • PHP.net, "PHP-FPM Configuration", https://www.php.net/manual/en/install.fpm.configuration.php