Ubuntu 24.04 生产环境 PHP 7.4 安装与配置指南
| 适用系统 | Ubuntu 24.04 LTS (Noble) |
| PHP 版本 | 7.4(通过 Ondřej Surý PPA 安装) |
| 运行模式 | PHP-FPM(FastCGI 进程管理器) |
| 配合 Web 服务器 | Nginx 1.30.3(源码编译,运行用户 nginx) |
| PHP-FPM 通信方式 | Unix Socket:/run/php/php7.4-fpm.sock |
| 配置文件目录 | /etc/php/7.4/ |
| 日志目录 | /var/log/php7.4-fpm.log |
一、添加 PHP 7.4 PPA 源
Ubuntu 24.04 官方源不包含 PHP 7.4,需要借助社区维护的 Ondřej Surý PPA。
1.1 安装必要工具
sudo apt update
sudo apt install -y software-properties-common
1.2 添加 PPA 源
sudo add-apt-repository ppa:ondrej/php
提示:若提示 add-apt-repository: command not found,请先执行 1.1 步骤安装 software-properties-common。
1.3 更新软件包列表
sudo apt update
二、安装 PHP 7.4 及 PHP-FPM
2.1 安装核心包
sudo apt install -y php7.4 php7.4-fpm
2.2 安装常用扩展(按需调整)
以下是一组生产环境常用的扩展,可根据项目需求增删:
sudo apt install -y \\
php7.4-mysql \\
php7.4-pgsql \\
php7.4-gd \\
php7.4-xml \\
php7.4-zip \\
php7.4-mbstring \\
php7.4-curl \\
php7.4-json \\
php7.4-bcmath \\
php7.4-soap \\
php7.4-intl
提示:如果不需要某些扩展,可去掉对应的包名。后续也可通过 sudo apt install php7.4-xxx 单独补充。
三、验证 PHP 版本
php7.4 -v
预期输出类似:
PHP 7.4.33 (cli) (built: … ) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0
查看已安装的扩展:
php -m
四、配置 PHP-FPM Socket 权限(关键步骤)
4.1 问题背景
- Nginx 源码编译安装,运行用户为 nginx。
- PHP-FPM 默认以 www-data 用户运行,创建的 Socket 文件 /run/php/php7.4-fpm.sock 属主为 www-data:www-data。
- 默认权限 660 下,nginx 用户无权访问该 Socket,导致 Nginx 报错:
connect() to unix:/run/php/php7.4-fpm.sock failed (13: Permission denied)
4.2 修改 PHP-FPM 池配置
编辑 PHP-FPM 池配置文件:
sudo vim /etc/php/7.4/fpm/pool.d/www.conf
找到并修改以下指令(如不存在则添加):
; Unix Socket 路径(默认已配置)
listen = /run/php/php7.4-fpm.sock
; 设置 Socket 文件的属主和组为 nginx
listen.owner = nginx
listen.group = nginx
; 设置 Socket 文件权限:属主和组可读写
listen.mode = 0660
修改前 vs 修改后对比:
| listen.owner | www-data | nginx |
| listen.group | www-data | nginx |
| listen.mode | 0660 | 0660(不变) |
4.3 重启 PHP-FPM 使配置生效
sudo systemctl restart php7.4-fpm
4.4 验证 Socket 文件权限
ls -la /run/php/php7.4-fpm.sock
预期输出:
srw-rw—- 1 nginx nginx 0 Jul 13 10:00 /run/php/php7.4-fpm.sock
确认属主和组均为 nginx,Nginx 进程可正常读写。
4.5 设置开机自启
sudo systemctl enable php7.4-fpm
五、配置 Nginx 支持 PHP 解析
5.1 编辑 Nginx 站点配置文件
sudo vim /usr/local/nginx/conf/conf.d/default.conf
5.2 完整配置示例
server {
listen 80;
server_name _;
root /data/www/default;
index index.php index.html index.htm;
# ———- PHP 请求转发至 PHP-FPM ———-
location ~ \\.php$ {
# 使用 Unix Socket 方式(与 php-fpm 配置一致)
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# ———- 静态资源缓存 ———-
location ~* \\.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
access_log off;
add_header Cache-Control "public, immutable";
}
# ———- 禁止访问敏感文件 ———-
location ~* \\.(env|git|bak|sql|swp|log|tar|gz|zip|rar|pem|key)$ {
deny all;
}
location ~ /\\. {
deny all;
}
# ———- 默认请求处理 ———-
location / {
try_files $uri $uri/ /index.php?$args;
}
# ———- 日志 ———-
access_log /data/logs/nginx/default_access.log json_log;
error_log /data/logs/nginx/default_error.log warn;
}
5.3 测试并重载 Nginx
sudo /usr/local/nginx/sbin/nginx -t
sudo systemctl reload nginx
六、验证 PHP 解析
6.1 创建测试文件
echo "<?php phpinfo(); ?>" | sudo tee /data/www/default/info.php
6.2 浏览器访问
访问 http://你的服务器IP/info.php,如果看到 PHP 信息页面,说明 PHP 已成功与 Nginx 集成。
6.3 安全提醒
测试完成后,立即删除测试文件:
sudo rm /data/www/default/info.php
七、PHP-FPM 进程池调优(生产环境必备)
7.1 核心计算公式
pm.max_children 的最大值取决于服务器内存,计算公式为:
pm.max_children ≈ (总内存 − 系统保留内存 − 其他服务内存) / 单个 PHP 进程平均内存
分步说明:
第一步:估算单个 PHP 进程占用内存
在正常负载下,一个 PHP 进程占用内存通常在 30MB ~ 80MB 之间(取决于代码复杂度)。通过以下命令查看实际占用:
ps aux | grep "php-fpm" | grep -v grep | awk '{print $6, $11}' | sort -n
输出第 6 列为 RSS 物理内存(单位 KB),取平均值。例如平均值为 50MB,则 单个进程内存 ≈ 50MB。
第二步:计算可用内存
free -h
- 总内存:free -h 的 total 值。
- 系统保留:建议为操作系统保留 1GB ~ 2GB(防止 OOM)。
- 其他服务:减去 Nginx、MySQL/PostgreSQL、Redis 等占用的内存。
示例计算(4GB 内存服务器):
- 总内存:4096 MB
- 系统保留:1024 MB
- 其他服务(Nginx + MySQL):约 512 MB
- 剩余可用:4096 – 1024 – 512 = 2560 MB
- 单个 PHP 进程平均:50 MB
- 推荐值:2560 / 50 ≈ 51 → 设置 pm.max_children = 50
7.2 参考配置表(保守推荐)
如果无法精确统计,可按以下参考值配置(假设单个进程平均占用 40~60MB):
| 1GB | 20 ~ 30 | 轻量级应用、测试环境 |
| 2GB | 30 ~ 50 | 小型网站、低流量 WordPress |
| 4GB | 50 ~ 80 | 中等规模 API、稳定生产站 |
| 8GB | 120 ~ 180 | 高并发业务、复杂 PHP 应用 |
| 16GB+ | 250 ~ 400 | 大型应用,需配合压测验证 |
⚠️ 重要警示:设置过大会导致内存耗尽,触发 Linux OOM Killer 杀死 PHP-FPM。建议由小到大逐步上调,并结合监控观察内存使用。
7.3 完整池配置示例
编辑池配置文件:
sudo vim /etc/php/7.4/fpm/pool.d/www.conf
; ———- 进程管理方式 ———-
; dynamic:动态调整进程数(推荐,灵活应对突发流量)
pm = dynamic
; ———- 核心参数 ———-
; 最大子进程数(根据上述公式计算,这里是 4GB 服务器的示例值)
pm.max_children = 50
; 初始启动进程数(通常为 max_children 的 10%~20%)
pm.start_servers = 8
; 空闲时最少保留进程数(保持响应速度)
pm.min_spare_servers = 6
; 空闲时最多保留进程数(避免闲置进程占用内存)
pm.max_spare_servers = 20
; ———- 防内存泄漏 ———-
; 每个子进程处理 500 个请求后自动重启
; 可释放可能积累的内存碎片,有效预防内存泄漏
pm.max_requests = 500
修改后重载 PHP-FPM:
sudo systemctl reload php7.4-fpm
7.4 监控与调优闭环
配置完成后,通过以下命令监控实际运行情况:
| 查看 PHP-FPM 内存排序 | ps aux –sort=-rss | grep php-fpm | head -20 |
| 查看系统剩余内存 | free -h |
| 查看 PHP-FPM 进程数 | ps aux | grep php-fpm | grep -v grep | wc -l |
| 查看 PHP-FPM 日志 | sudo tail -f /var/log/php7.4-fpm.log |
调优决策:
- free -h 显示剩余内存长期 < 500MB → 降低 pm.max_children
- 日志频繁出现 "server reached pm.max_children setting" → 提高 pm.max_children(前提是内存充裕)
- 日志频繁出现 "php-fpm: pool www" 相关的 OOM 报错 → 降低 pm.max_children 并检查代码内存泄漏
八、常用管理命令
8.1 PHP-FPM 服务管理
sudo systemctl start php7.4-fpm # 启动
sudo systemctl stop php7.4-fpm # 停止
sudo systemctl restart php7.4-fpm # 重启
sudo systemctl reload php7.4-fpm # 重载配置(推荐)
sudo systemctl status php7.4-fpm # 查看状态
sudo systemctl enable php7.4-fpm # 开机自启
8.2 PHP 扩展管理
# 查看已安装的扩展
php -m
# 安装新扩展(示例)
sudo apt install php7.4-redis
sudo systemctl reload php7.4-fpm
# 搜索可用扩展
sudo apt search php7.4-
8.3 配置信息查看
# 查看 PHP 配置文件路径
php -i | grep "Configuration"
# 查看加载的扩展
php -i | grep "Loaded"
# 查看特定扩展信息(如 opcache)
php -i | grep opcache
九、常见问题及解决方法
| connect() to unix:…sock failed (13: Permission denied) | Socket 属主不是 Nginx 用户 | 修改 listen.owner 和 listen.group 为 nginx,重启 PHP-FPM(见第四节) |
| 访问 PHP 文件显示 502 Bad Gateway | PHP-FPM 未运行或 Socket 路径不匹配 | 检查 systemctl status php7.4-fpm,确认 Nginx fastcgi_pass 与 PHP-FPM listen 一致 |
| 访问 PHP 文件变成下载 | Nginx 未配置 PHP 解析 | 检查站点配置中 location ~ \\.php$ 块是否正确(见第五节) |
| add-apt-repository: command not found | 缺少 software-properties-common | sudo apt install -y software-properties-common |
| php7.4-fpm: command not found | PHP-FPM 未安装或未加入 PATH | sudo apt install -y php7.4-fpm |
| 内存占用持续增长 | 代码存在内存泄漏 | 启用 pm.max_requests 让子进程定期重启 |
十、安装信息汇总
| PHP 版本 | 7.4 |
| PHP 可执行文件 | /usr/bin/php7.4 |
| PHP-FPM 服务名 | php7.4-fpm |
| PHP 主配置文件 | /etc/php/7.4/cli/php.ini(CLI)/etc/php/7.4/fpm/php.ini(FPM) |
| PHP-FPM 池配置 | /etc/php/7.4/fpm/pool.d/www.conf |
| PHP-FPM Socket | /run/php/php7.4-fpm.sock(属主 nginx:nginx) |
| 扩展配置目录 | /etc/php/7.4/mods-available/ |
| 扩展启用目录 | /etc/php/7.4/fpm/conf.d/ |
| PHP-FPM 日志 | /var/log/php7.4-fpm.log |
| Nginx 站点根目录 | /data/www/default/ |
| Nginx 站点配置 | /usr/local/nginx/conf/conf.d/default.conf |
附录:配置检查清单
部署完成后,逐项确认以下检查点:
- PHP 7.4 安装成功:php7.4 -v 显示正确版本
- 所需扩展已安装:php -m 检查
- PHP-FPM 服务运行正常:sudo systemctl status php7.4-fpm
- Socket 文件属主为 nginx:nginx:ls -la /run/php/php7.4-fpm.sock
- Nginx 配置包含正确的 location ~ \\.php$ 块
- Nginx 配置测试通过:sudo /usr/local/nginx/sbin/nginx -t
- info.php 测试页面可正常访问并显示 PHP 信息
- 测试后已删除 info.php 文件
- 根据服务器内存调整了 pm.max_children 值
- PHP-FPM 已设置为开机自启
文档版本:2.0
适用 PHP 版本:7.4
配合 Nginx 版本:1.30.3
最后更新:2026-07-13
