在 Ubuntu 上优化 PHP-FPM 性能,通常从 进程管理、系统资源、PHP 配置、OPcache、内核参数 几个方面入手。下面按实战角度说明。
PHP-FPM 有 3 种 pm 模式:
pm = static
pm.max_children = 100
✅ 适合内存充足、访问量稳定的服务器
❌ 内存占用固定
pm = dynamic
pm.max_children = 120
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 40
✅ 内存和性能平衡
✅ 推荐大多数 Web 服务器
pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
✅ 内存极低
❌ 高并发时延迟明显
路径:
/etc/php/8.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 120
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 40
; 请求上限,防止内存泄漏
pm.max_requests = 500
; 超时控制
request_terminate_timeout = 30s
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log
sudo apt install php8.1-opcache
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.validate_timestamps=0 ; 生产环境建议关
⚠️ 改代码后需
reload php-fpm
memory_limit = 256M
max_execution_time = 30
upload_max_filesize = 20M
post_max_size = 20M
expose_php = Off
rlimit_files = 65535
ulimit -n 65535
/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 60;
fastcgi_read_timeout 60;
listen = /run/php/php8.1-fpm.sock
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_tw_reuse=1
/etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
pm.status_path = /status
Nginx:
location /status {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
}
❌ max_children 设太大 → 内存爆
❌ validate_timestamps=1 生产环境
❌ 使用 TCP 而非 socket
❌ 不监控 slow log
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 500
如果你愿意,可以告诉我:
我可以帮你 直接给出一份最优配置。