在 Ubuntu 上优化 PHP-FPM 性能,核心目标是:减少进程开销、提高并发能力、避免内存耗尽、减少响应延迟。下面从 配置、系统、代码、监控 四个层面给你一套实用优化方案(适用于高并发或生产环境)。
配置文件位置(以 PHP 8.x 为例):
/etc/php/8.x/fpm/pool.d/www.conf
推荐:pm = dynamic(最常用)或 ondemand(低流量)
pm = dynamic
| 模式 | 适用场景 |
|---|---|
| static | 稳定高并发(内存充足) |
| dynamic | ✅ 生产环境推荐 |
| ondemand | 低流量、节省内存 |
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
pm.max_children公式:
max_children = 可用内存 / 每个 PHP 进程平均内存
示例:
3000MB / 40MB ≈ 75
✅ 建议留余量,不要跑满内存
pm.max_requests = 500
✅ 每个子进程处理 500 个请求后自动重启
✅ 强烈建议开启
sudo apt install php8.x-opcache
编辑:
/etc/php/8.x/fpm/php.ini
推荐配置:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0 ; 生产环境关闭
opcache.revalidate_freq=0
✅ 可提升 30%~100% 性能
php -m
禁用未使用扩展,减少内存占用。
ulimit -n
如果 < 65535,修改:
/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
/etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
sysctl -p
worker_processes auto;
worker_connections 10240;
keepalive_timeout 65;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.x-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
pm.status_path = /status
Nginx:
location /status {
fastcgi_pass unix:/run/php/php8.x-fpm.sock;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}
访问:
curl http://127.0.0.1/status
关注:
active processesmax children reachedps -ylC php-fpm --sort:rss
❌ pm.max_children 设置过大 → 内存爆掉
❌ validate_timestamps=1 生产环境开启 → 性能下降
❌ 使用 pm = static 但流量不稳定
❌ 没开 OPcache
pm = dynamic
pm.max_children = 70
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 25
pm.max_requests = 500
如果你愿意,可以告诉我:
我可以直接给你一套 精准参数配置。