核心是确保服务互通、PHP被Web服务器识别、端口无冲突:一、配置桥接/NAT网络并验证虚拟机IP可达;二、用包管理器安装php-fpm及扩展,运行php-fpm -t并启用服务;三、Apache需启用proxy_fcgi模块并ProxyPass匹配PHP请求,Nginx需正确配置fastcgi_pass与SCRIPT_FILENAME;四、通过Web访问info.php确认Server API为FPM/FastCGI,且重启php-fpm与Web服务双生效。

虚拟机里搭 PHP 环境,核心不是“能不能装上”,而是“装完能不能稳定跑项目”。绝大多数失败都卡在服务没通、PHP 不被 Web 服务器识别、或端口冲突这三处。下面四个步骤按真实调试顺序组织,每步直指一个关键断点。
确认虚拟机网络模式与静态 IP 是否可用
桥接模式或 NAT+虚拟交换机是必须项;仅用 Host-only 或默认 NAT 很可能无法从宿主机访问 localhost 或域名。常见错误现象:宿主机浏览器打不开 http://192.168.x.x,ping 不通,vagrant ssh 连不上。
- Hyper-V 用户必须运行
New-NetNat创建 NAT 网络,并给虚拟网卡配192.168.100.1/24类似地址,否则vagrant up后 IP 会漂移 - VirtualBox 用户勾选“桥接网卡”后,用
ip a查看是否获取到和宿主机同段的 IP(如宿主机是192.168.1.5,虚拟机应为192.168.1.100) - CentOS 7+ 默认禁用
network.service,改用NetworkManager,静态 IP 要写进/etc/sysconfig/network-scripts/ifcfg-ens33并设ONBOOT=yes
区分包管理安装 vs 源码编译:优先用 apt install php 或 yum install php-fpm
除非你明确需要 PHP 5.6 或定制 SAPI,否则别碰 ./configure && make && make install。源码编译后容易漏掉 php-fpm 服务注册、systemd 单元文件缺失、或 libxml2-dev 等构建依赖未装全,导致 php -v 成功但 systemctl start php-fpm 报 Failed to start php-fpm.service: Unit php-fpm.service not found。
- Ubuntu/Debian:直接
sudo apt install php-fpm php-mysql php-curl php-mbstring php-xml php-zip,不装php元包也行,php-fpm自带 CLI - CentOS/RHEL:用
sudo yum install php-fpm php-mysqlnd php-gd php-mbstring php-xml,注意php-mysql已废弃,必须用php-mysqlnd - 装完立刻验证:运行
php-fpm -t检查配置语法,再sudo systemctl start php-fpm && sudo systemctl enable php-fpm
Web 服务器必须显式对接 PHP-FPM,不能只靠 mod_php
Apache 的 libapache2-mod-php 或 Nginx 的 fastcgi_pass 配置一旦漏掉或写错,页面就直接下载 .php 文件或返回 502。这不是 PHP 没装好,是管道没接通。
立即学习“PHP免费学习笔记(深入)”;
- Apache 用户检查是否启用了
proxy_fcgi和setenvif模块:a2enmod proxy_fcgi setenvif,再在虚拟主机配置里加:ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/ - Nginx 用户必须在
location ~ \.php$块中写明:fastcgi_pass 127.0.0.1:9000(或unix:/run/php/php8.3-fpm.sock),且确保fastcgi_param SCRIPT_FILENAME指向真实路径 - PHP-FPM 默认监听
127.0.0.1:9000,但某些镜像(如 CentOS minimal)会默认监听 socket,用sudo ss -tlnp | grep :9000确认监听方式
测试页必须包含 phpinfo() 且由 Web 服务器解析
很多人在终端跑 php -i | grep 'Loaded Configuration File' 看到配置路径就以为 OK,但 Web 环境用的是另一套 ini——php-fpm 加载的是 /etc/php/*/fpm/php.ini,不是 CLI 的 /etc/php/*/cli/php.ini。两者时区、扩展、display_errors 可能完全不同。
- 在 Web 根目录(如
/var/www/html)建info.php,内容只有:<?php phpinfo(); ?> - 浏览器访问
http://192.168.x.x/info.php,页面顶部明确显示Server API: FPM/FastCGI才算真正打通 - 如果页面空白但 HTTP 状态码是 200,检查
error_log路径是否可写,或临时把php-fpm.conf中的catch_workers_output = yes打开
最常被跳过的动作:改完任何配置(尤其是 php-fpm.conf 或 Nginx/Apache 虚拟主机文件)后,必须分别重启 php-fpm 和 Web 服务,缺一不可。两个进程各自缓存配置,只重启一个等于没动。



















