推荐用 apt 安装 php + nginx,因其遵循 debian/ubuntu 规范、配置统一、服务易管、升级便捷;需添加 ondrej/php ppa 获取新版 php;fastcgi_pass 必须与 php-fpm 监听地址严格匹配,并同步调整 php 和 nginx 的上传限制。

直接用 apt 装 PHP + Nginx 是最快、最稳的入门方式,只要别在生产环境硬套默认配置就行。Ubuntu 官方源和 ppa:ondrej/php 组合足够覆盖绝大多数开发需求,不用编译、不碰路径冲突、不手动管理 socket 文件。
为什么推荐 apt 而不是源码编译
源码编译适合定制模块或压测调优,但日常开发里它带来三类麻烦:make install 后二进制位置不统一(/usr/local/nginx/sbin/nginx vs /usr/sbin/nginx),systemd 服务文件得自己写,PHP 版本升级要重编译整个链路。而 apt 安装的 nginx 和 php*-fpm 全部遵循 Debian/Ubuntu 的包管理规范:配置在 /etc/,服务由 systemctl 管理,日志走 journald,升级只需 apt upgrade —— 这才是开发机该有的体验。
必须加的 PPA 源才能装上新版 PHP
Ubuntu 官方源里的 PHP 版本滞后严重(比如 20.04 默认是 php7.4,22.04 默认是 php8.1),而 ondrej/php PPA 提供从 php7.4 到 php8.3 的所有稳定版,且带完整扩展。漏掉这步,apt install php8.2-fpm 会报 “package not found”。
- 执行顺序不能错:
sudo apt update && sudo apt install -y software-properties-common - 添加源:
sudo add-apt-repository -y ppa:ondrej/php - 再更新一次索引:
sudo apt update(这步很多人跳过,结果搜不到包) - 验证是否生效:
apt list --upgradable | grep php应该能看到可安装的版本列表
nginx.conf 里最容易写错的 fastcgi_pass 地址
错误现象:502 Bad Gateway,curl -I http://localhost/test.php 返回空响应,journalctl -u nginx -n 20 里出现 connect() to unix:/var/run/php/php8.2-fpm.sock failed 或 connect() to 127.0.0.1:9000 failed —— 这说明 fastcgi_pass 和 PHP-FPM 实际监听地址不匹配。
- 先查 PHP-FPM 监听方式:
sudo cat /etc/php/8.2/fpm/pool.d/www.conf | grep listen =,常见值是unix:/run/php/php8.2-fpm.sock(Unix socket)或127.0.0.1:9000(TCP) - nginx 配置必须严格对应:
fastcgi_pass unix:/run/php/php8.2-fpm.sock;或fastcgi_pass 127.0.0.1:9000; - 注意路径中
/run/php/和/var/run/php/是软链接,但写配置时以www.conf里为准;/var/run是/run的符号链接,但硬编码/var/run在某些系统会失效 - 改完配置后必须 reload:
sudo nginx -t && sudo systemctl reload nginx,只 restart 不够,reload 才能热加载 fastcgi 设置
php.ini 和 nginx.conf 的上传限制要同步改
前端上传大文件失败、$_FILES 为空、upload_max_filesize 不生效——根本原因是 PHP 层和 Nginx 层各管一段,必须双改。
- PHP 层改两个值:
upload_max_filesize和post_max_size(后者必须 ≥ 前者),都在/etc/php/8.2/fpm/php.ini里 - Nginx 层加一行:
client_max_body_size 100M;,放在http{}或server{}块里都行,但不能放在location{}里 - 改完 PHP 配置必须重启 FPM:
sudo systemctl restart php8.2-fpm;Nginx 只需 reload - 验证是否生效:
php -i | grep -E "(upload_max_filesize|post_max_size)"和nginx -T 2>/dev/null | grep client_max_body_size
真正卡住人的从来不是“怎么装”,而是 fastcgi_pass 地址不一致、socket 文件权限不对、上传限制只改一半。这些点不手动验证,光复制粘贴配置基本必挂。调试时优先看 journalctl -u php8.2-fpm -n 30 和 sudo tail -f /var/log/nginx/error.log,比翻文档快十倍。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











