温馨提示×

Ubuntu PHP-FPM如何调优

小樊
43
2026-07-13 20:25:35
栏目: 编程语言

在 Ubuntu 上优化 PHP-FPM(FastCGI Process Manager),核心目标是:提高并发能力、降低内存占用、减少响应延迟。下面从配置、系统、监控、常见场景几个方面系统讲解。


一、先确认环境

php -v
php-fpm -v

常见路径(以 PHP 8.1 为例):

/etc/php/8.1/fpm/pool.d/www.conf
/etc/php/8.1/fpm/php-fpm.conf

重启命令:

sudo systemctl restart php8.1-fpm

二、PHP-FPM 进程模型(最关键)

1️⃣ 进程管理模式(pm)

www.conf 中核心参数:

pm = dynamic

常见模式对比:

模式 说明 适用场景
static 固定进程数 高并发、稳定流量
dynamic 动态调整 默认推荐
ondemand 按需启动 内存敏感、低流量

推荐:dynamic(大多数情况)


2️⃣ dynamic 模式参数调优

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

如何计算 pm.max_children

公式:

max_children ≈ 可用内存 / 每个 PHP 进程内存

示例:

ps -ylC php-fpm --sort:rss

假设每个进程 60MB,服务器 4GB:

4096MB / 60MB ≈ 68

✅ 建议留余量,不要跑满内存


三、请求处理优化

1️⃣ 请求超时

request_terminate_timeout = 30s

防止死循环或慢脚本拖垮 FPM


2️⃣ 最大请求数(防内存泄漏)

pm.max_requests = 500

✅ 推荐 300–1000


四、Socket vs TCP(性能提升)

✅ 推荐使用 Unix Socket

listen = /run/php/php8.1-fpm.sock

Nginx 配置:

fastcgi_pass unix:/run/php/php8.1-fpm.sock;

✅ 比 TCP 127.0.0.1 更快、更少开销


五、权限 & 用户优化

user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

避免 502 / 权限错误


六、PHP 本身优化(php.ini)

memory_limit = 128M
max_execution_time = 30
upload_max_filesize = 20M
post_max_size = 20M
opcache.enable=1

七、OPcache(必开)

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=0
opcache.validate_timestamps=0  # 生产环境

✅ 可提升 2–5 倍性能


八、系统层面优化(Ubuntu)

1️⃣ 文件描述符

ulimit -n

建议:

* soft nofile 65535
* hard nofile 65535

2️⃣ systemd 限制

sudo systemctl edit php8.1-fpm
[Service]
LimitNOFILE=65535

九、Nginx 配合优化(简要)

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 60;
fastcgi_read_timeout 60;

十、监控 & 排错

1️⃣ PHP-FPM 状态页

pm.status_path = /status

Nginx:

location /status {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

访问:

http://your-domain/status

2️⃣ 常见错误

问题 原因
502 socket 权限 / FPM 没启动
504 request_terminate_timeout
内存爆 max_children 过大

十一、常见场景推荐配置

✅ 小型站点(1–2GB)

pm = dynamic
pm.max_children = 20
pm.start_servers = 5

✅ 中型站点(4–8GB)

pm = dynamic
pm.max_children = 60100

✅ 高并发 API / 电商

pm = static
pm.max_children = 120

十二、调优顺序建议

  1. 先开 OPcache
  2. 再根据内存算 max_children
  3. 使用 Unix Socket
  4. max_requests
  5. 最后系统 & Nginx 微调

如果你愿意,可以告诉我:

  • ✅ 服务器内存
  • ✅ CPU 核数
  • ✅ 网站类型(WordPress / Laravel / API)
  • ✅ 并发量

我可以直接给你一套可复制的优化配置

0