在 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
www.conf 中核心参数:
pm = dynamic
常见模式对比:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| static | 固定进程数 | 高并发、稳定流量 |
| dynamic | 动态调整 | 默认推荐 |
| ondemand | 按需启动 | 内存敏感、低流量 |
✅ 推荐: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
✅ 建议留余量,不要跑满内存
request_terminate_timeout = 30s
防止死循环或慢脚本拖垮 FPM
pm.max_requests = 500
✅ 推荐 300–1000
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 / 权限错误
memory_limit = 128M
max_execution_time = 30
upload_max_filesize = 20M
post_max_size = 20M
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=0
opcache.validate_timestamps=0 # 生产环境
✅ 可提升 2–5 倍性能
ulimit -n
建议:
* soft nofile 65535
* hard nofile 65535
sudo systemctl edit php8.1-fpm
[Service]
LimitNOFILE=65535
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 60;
fastcgi_read_timeout 60;
pm.status_path = /status
Nginx:
location /status {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
访问:
http://your-domain/status
| 问题 | 原因 |
|---|---|
| 502 | socket 权限 / FPM 没启动 |
| 504 | request_terminate_timeout |
| 内存爆 | max_children 过大 |
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm = dynamic
pm.max_children = 60–100
pm = static
pm.max_children = 120
如果你愿意,可以告诉我:
我可以直接给你一套可复制的优化配置。