欢迎光临
我们一直在努力

Ubuntu 24.04 生产环境 PHP 7.4 安装与配置指南

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):

服务器总内存推荐 pm.max_children适用场景
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

赞(0)
未经允许不得转载:171主机测评 » Ubuntu 24.04 生产环境 PHP 7.4 安装与配置指南
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址