LNMP中PHP-FPM配置详解
小樊
37
2025-12-06 03:48:39
LNMP中PHP-FPM配置详解
一 架构与配置文件结构
- 在 LNMP 架构中,Nginx 通过 FastCGI 将 PHP 请求转发给 PHP-FPM 处理;PHP-FPM 采用 master/worker 模型,master 负责管理、worker 负责执行脚本。常见目录结构为:全局配置 php-fpm.conf,进程池配置位于 /etc/php/{version}/fpm/pool.d/*.conf(如 www.conf)。进程间通信可走 Unix socket(如 /run/php/php{version}-fpm.sock)或 TCP 127.0.0.1:9000。多站点可按需拆分多个 pool 做资源隔离,避免相互影响。
二 核心配置项与推荐值
- 进程管理(pm)
- 模式:推荐 dynamic(按负载伸缩);专用高并发或内存充足场景可用 static。
- 关键参数:pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。经验关系:start_servers 常取 (min_spare + max_spare) / 2,且需满足 max_children > max_spare_servers。
- 请求与脚本控制
- pm.max_requests:每个子进程在处理若干请求后自动重启,用于缓解第三方扩展潜在内存泄漏;设为 0 表示不重启。
- request_terminate_timeout:强制终止单个请求的超时时间(覆盖脚本层面的 max_execution_time 的场景);0 表示关闭。
- request_slowlog_timeout / slowlog:定位慢脚本,超时后记录完整调用栈,便于排查性能瓶颈。
- 监听与权限
- listen:Unix socket 性能通常优于 TCP;使用 socket 时需设置 listen.owner / listen.group / listen.mode(如 www/www 0660)确保 Nginx 可访问。
- 如需限制来源,可用 listen.allowed_clients(仅允许指定 IP 访问 FPM)。
- 日志与告警
- 全局:error_log / log_level;进程池内可用 php_admin_value[error_log] 与 php_admin_flag[log_errors] 写入到指定文件,便于分池记录。
- 状态与存活探测:pm.status_path = /status、ping.path = /ping、ping.response = pong,配合监控与探活使用。
- 资源与系统限制
- rlimit_files / rlimit_core:文件描述符与 core dump 限制,必要时调大以避免 “Too many open files” 或无法生成 core。
三 调优计算与示例配置
- 计算思路
- 估算单进程内存:Resident Set Size(RSS)≈ 应用常驻内存(含框架、扩展、OPcache 元数据等)。
- 最大进程数上限:N_max ≈ 可用内存 / 单进程 RSS。务必为系统与其他服务预留充足内存。
- 动态策略:设置 min/max spare 维持缓冲;start_servers 取中间值;max_children 略大于峰值并发需求并满足上述不等式关系。
- 示例(仅演示计算方法,非通用值)
- 假设:可用内存 8GB,单进程 RSS 80MB,峰值并发 150。
- 估算:N_max ≈ 8192 / 80 ≈ 102;为突发预留可设 pm.max_children = 120。
- 动态参数可试:pm.start_servers = 40,pm.min_spare_servers = 20,pm.max_spare_servers = 60(满足 start 介于 min/max 且 max_children > max_spare)。
- 参考配置片段(/etc/php/{version}/fpm/pool.d/www.conf)
- 进程管理
- pm = dynamic
- pm.max_children = 120
- pm.start_servers = 40
- pm.min_spare_servers = 20
- pm.max_spare_servers = 60
- pm.max_requests = 1000
- 请求控制
- request_terminate_timeout = 0
- request_slowlog_timeout = 10s
- slowlog = /var/log/php-fpm/www-slow.log
- 监听与权限(Unix socket 示例)
- listen = /run/php/php{version}-fpm.sock
- listen.owner = www
- listen.group = www
- listen.mode = 0660
- 日志与状态
- php_admin_value[error_log] = /var/log/php-fpm/www-error.log
- php_admin_flag[log_errors] = on
- pm.status_path = /status
- ping.path = /ping
- ping.response = pong
- 资源限制
- rlimit_files = 65535
- rlimit_core = 0
- 提示:若为 TCP 监听,使用 listen = 127.0.0.1:9000,并可按需设置 listen.allowed_clients。
四 Nginx 联动与验证
- Nginx 典型 FastCGI 配置片段
- location ~ .php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php{version}-fpm.sock; # 或 fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
- 服务与语法
- 语法检查:php-fpm 配置测试 php-fpm -t;Nginx 配置测试 nginx -t。
- 启停与热重载:
- systemd:启动/开机自启 systemctl start|enable php{version}-fpm;Nginx systemctl restart nginx。
- 信号:平滑重启 kill -USR2 ;优雅停止 kill -INT 。
- 验证
- 创建 /var/www/html/info.php:,访问确认解析正常。
- 访问状态与探活:/status、/ping(需与防火墙、访问控制配合)。
五 监控 日志与常见故障排查
- 日志与监控
- 关注 /var/log/php-fpm.log、Nginx error.log 与进程池慢日志;结合 pm.status_path 输出与监控系统(如 Munin 等)观察 active/queued 等指标,及时识别进程不足或阻塞。
- 常见错误与处理
- 502 Bad Gateway:多由 FPM 进程不足、崩溃或监听不匹配导致。检查 max_children 是否过小、FPM 是否存活、Nginx 的 fastcgi_pass 与 FPM 的 listen 一致;查看 FPM/Nginx 错误日志定位根因。
- 504 Gateway Timeout:脚本执行过慢或 FPM 请求超时。适当增大 request_terminate_timeout 或优化慢脚本;配合 request_slowlog_timeout 与 slowlog 精确定位。
- File not found:常见于 SCRIPT_FILENAME 路径错误或 root 配置不当;核对 Nginx root 与 fastcgi_param SCRIPT_FILENAME 拼接结果是否指向真实文件。
- Permission denied(socket):检查 listen.owner / listen.group / listen.mode 与 Nginx worker 用户是否一致,以及 socket 文件目录权限。