博客 / Linux/ LNMP 环境中 PHP-FPM 配置优化指南( 最新版)

LNMP 环境中 PHP-FPM 配置优化指南( 最新版)

LNMP 环境中 PHP-FPM 配置优化指南( 最新版)

PHP-FPM 配置文件位置与编辑

PHP-FPM 的主配置文件通常位于以下路径之一,具体取决于您的安装方式和操作系统:

  • 源码编译安装/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php-fpm.d/www.conf
  • 包管理器安装(如 apt/yum)/etc/php/{version}/fpm/php-fpm.conf/etc/php/{version}/fpm/pool.d/www.conf

您可以使用任何文本编辑器进行编辑,例如:

# 使用 vi 编辑主配置文件
vi /usr/local/php/etc/php-fpm.conf
# 或编辑进程池配置文件(更常见)
vi /usr/local/php/etc/php-fpm.d/www.conf

核心配置参数详解与优化建议

以下是对关键配置项的说明和优化建议。请根据您的服务器硬件(CPU、内存)和应用负载进行调整。

进程管理 (pm) 模式

这是影响性能和资源占用的最关键设置。

  • pm = dynamic (推荐):动态进程管理。子进程数量在最小和最大值之间浮动。
  • pm = static:静态进程管理。固定数量的子进程,适合高流量、内存充足的服务器。
  • pm = ondemand:按需启动进程。适合低流量或内存极度紧张的环境,但请求到来时会有启动延迟。

动态模式下的进程数设置

对于 pm = dynamic,需要设置以下参数:

pm.max_children = 50        # 最大子进程数。这是硬性限制,决定了 PHP-FPM 能创建的最大进程数。
pm.start_servers = 5        # 启动时创建的子进程数。
pm.min_spare_servers = 2    # 最小空闲进程数。当空闲进程少于这个数时,会创建新进程。
pm.max_spare_servers = 8    # 最大空闲进程数。当空闲进程多于这个数时,会结束多余进程。

计算建议pm.max_children 的值主要受服务器内存限制。一个简单的估算公式为:

pm.max_children ≈ 服务器可用内存 / 单个 PHP 进程平均内存占用

例如,1GB 内存的服务器,如果单个 PHP 进程占用约 50MB,则理论上 pm.max_children 可设为 20。但需为系统和其他服务(如 Nginx、MySQL)预留内存,因此实际值应更小。

请求与超时设置

pm.max_requests = 500        # 每个子进程处理指定数量的请求后自动重启,有助于防止内存泄漏。
request_terminate_timeout = 30s  # 单个请求的最大执行时间。如果经常遇到 502 错误,可适当调高(如 60s)。
request_slowlog_timeout = 10s    # 慢请求日志阈值,超过此时间的请求会被记录到慢日志中。
slowlog = /var/log/php-fpm/$pool-slow.log  # 慢日志路径。

监听与连接设置

# 方式一:使用 Unix Socket(推荐,同主机 Nginx+PHP-FPM 时性能更好)
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

# 方式二:使用 TCP Socket(适用于 PHP-FPM 与 Nginx 不在同一主机的情况)
# listen = 127.0.0.1:9000
# listen.allowed_clients = 127.0.0.1  # 允许连接的 IP,TCP 方式下建议设置。

日志与状态监控

access.log = /var/log/php-fpm/$pool-access.log  # 访问日志
slowlog = /var/log/php-fpm/$pool-slow.log       # 慢日志
pm.status_path = /status  # 启用状态页,可通过 URL(如 /status)查看 FPM 状态
ping.path = /ping         # 健康检查端点
ping.response = pong

配置示例:1核1G云服务器优化

针对低配置云服务器(如 1 核 CPU,1GB 内存),以下是一个相对保守且稳定的配置示例,适用于中小型 WordPress 或 Laravel 应用。

; 进程管理
pm = dynamic
pm.max_children = 20          ; 最大进程数,根据内存估算
pm.start_servers = 4          ; 启动进程数
pm.min_spare_servers = 2      ; 最小空闲进程
pm.max_spare_servers = 6      ; 最大空闲进程
pm.max_requests = 500         ; 防止内存泄漏

; 监听设置(使用 Unix Socket 以提升性能)
listen = /run/php/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660

; 用户和组
user = www
group = www

; 超时与日志
request_terminate_timeout = 30s  ; 防止脚本长时间运行
request_slowlog_timeout = 5s     ; 记录 5 秒以上的慢请求
slowlog = /var/log/php-fpm/slow.log

; 资源限制
rlimit_files = 4096              ; 提高文件打开数限制
rlimit_core = 0                  ; 不生成核心转储文件

优化后检查与调试步骤

  1. 语法检查:修改配置后,运行 php-fpm -t 测试配置文件语法是否正确。
  2. 重启服务systemctl restart php-fpmservice php-fpm restart
  3. 查看状态:通过 systemctl status php-fpm 查看服务状态,或访问配置的 pm.status_path 页面。
  4. 监控资源:使用 top, htopglances 命令监控内存和 CPU 使用情况,确保 pm.max_children 设置合理,不会导致内存耗尽。

通过以上配置和优化,您可以在 LNMP 环境中显著提升 PHP-FPM 的稳定性和性能。请务必根据实际负载情况进行微调。

发表评论

您的邮箱不会公开。必填项已用 * 标注。