ubuntu配php环境需完成四步闭环:装对组件(如libapache2-mod-php或php-fpm)、打通通信(确保socket路径与用户权限一致)、指对目录(root路径与script_filename匹配)、验准行为(用php -m和php-fpm -i确认模块及配置生效)。

Ubuntu 上配 PHP 环境,不是装完 php 就能跑起来的——缺了 Web 服务器、没连上 PHP-FPM、权限或路径写错,502 Bad Gateway 或空白页是常态。关键在四步闭环:装对组件、打通通信、指对目录、验准行为。
装 PHP 和扩展必须带 php-fpm 和 libapache2-mod-php(选 Apache 时)
Ubuntu 默认源里的 PHP 版本偏旧,但直接用 apt install php 只装 CLI 模式,Web 无法调用。要跑网站,得按用途选包:
- Apache 用户:必须装
libapache2-mod-php,否则.php文件会被当纯文本下载;执行sudo a2enmod php后还得sudo systemctl restart apache2 - Nginx 用户:必须装
php-fpm,不能只装php;版本号要对齐,比如装了php8.1,就得用php8.1-fpm,配置里写fastcgi_pass unix:/run/php/php8.1-fpm.sock - 扩展别漏
php-mbstring和php-xml——Laravel、Symfony 一启动就报错;php-opcache要手动启用,否则性能差一截 - 验证命令别只跑
php -v,补一句php -m | grep -E "fpm|mysql|mbstring",确认模块真加载了
/etc/php/*/fpm/pool.d/www.conf 里三个参数必须一致
PHP-FPM 不是装完就自动和 Nginx 对得上——它默认以 www-data 用户跑,但 socket 文件属主/属组、FPM 进程用户、Nginx worker 用户三者不一致,就会 Permission denied。
-
listen.owner和listen.group必须设成www-data(Ubuntu 标准) -
user和group也必须是www-data,不能写root或留空 -
listen = /run/php/php8.1-fpm.sock路径要和 Nginx 配置里fastcgi_pass完全一致;注意/run/php/是内存文件系统,重启后重建,别硬链到/var/run/ - 改完配置必须
sudo systemctl restart php8.1-fpm,光 reload 不生效
Nginx 的 location ~ \.php$ 块漏掉 fastcgi_param SCRIPT_FILENAME 就 404
很多教程复制粘贴时删掉了这行,结果访问 info.php 返回 404 或空白——Nginx 找得到 PHP 文件,但传给 FPM 时没告诉它“要执行哪个文件”。
- 标准写法里,
include snippets/fastcgi-php.conf已包含该参数,但前提是这个文件存在且未被注释;检查路径:/etc/nginx/snippets/fastcgi-php.conf - 如果手动写,必须加:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,$document_root要和root指令值完全匹配 - 常见坑:
root /var/www/myapp时,info.php得放/var/www/myapp/info.php;若框架要求入口在public/,root就得写/var/www/myapp/public,否则index.php找不到 - 改完配置务必
sudo nginx -t测语法,再sudo systemctl reload nginx
phpinfo() 显示但项目报 Class not found?查 php.ini 加载路径
终端里 php -v 和浏览器里 phpinfo() 显示的 Loaded Configuration File 经常不一样——CLI 用一套 ini,FPM 用另一套,扩展开了但没加载进 Web 环境。
- 运行
php --ini查 CLI 加载路径,php-fpm -i | grep "Loaded Configuration File"查 FPM 实际加载的 ini - Ubuntu 下 FPM 的主 ini 通常在
/etc/php/8.1/fpm/php.ini,CLI 在/etc/php/8.1/cli/php.ini;改错地方等于白改 - 开
opcache要在 FPM 的 ini 里设opcache.enable=1,CLI 的 ini 开了也没用 - 上传限制、时区、错误报告级别这些影响运行的行为,都得在 FPM 的 ini 里调,而不是 CLI 的
最易被忽略的是:PHP-FPM 配置改了、Nginx 配置改了、php.ini 也改了,但没重启对应服务,或者重启顺序错了(比如先 reload Nginx 再 start php-fpm),导致状态不一致。每次调完,用 sudo systemctl status php8.1-fpm nginx 看两服务都是 active (running),再测请求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











