PHP-fpm 配置文件路径与编辑方法
PHP-fpm 的主配置文件通常位于 /usr/local/php/etc/php-fpm.conf。如需修改配置,可使用文本编辑器(如 vi)进行编辑,之后重新加载或重启 PHP-fpm 服务即可。
# 编辑配置文件
vi /usr/local/php/etc/php-fpm.conf
# 重新加载配置(平滑重启)
service php-fpm reload
# 或完全重启服务
service php-fpm restart
核心配置项详解
以下是一些对性能影响显著的关键配置项。
进程管理方式 (pm)
pm 参数定义了 PHP-fpm 子进程的管理模式,可选值为 static(静态)或 dynamic(动态)。
- static:固定数量的子进程。仅
pm.max_children参数生效。 - dynamic:子进程数量根据负载动态调整。此时
pm.max_children失效,由pm.start_servers、pm.min_spare_servers和pm.max_spare_servers共同控制。
进程数量控制参数
pm.max_children:静态模式下允许创建的最大子进程数。pm.start_servers:动态模式下的初始子进程数。pm.min_spare_servers:动态模式下,空闲进程的最小数量。pm.max_spare_servers:动态模式下,空闲进程的最大数量。
请求超时与进程回收
request_terminate_timeout:设置单个 PHP 请求的最大执行时间(秒)。超时后,PHP-fpm 将终止该进程以释放资源。例如:request_terminate_timeout = 30。pm.max_requests:设置每个子进程在处理一定数量的请求后自动重启,有助于防止潜在的内存泄漏。例如:pm.max_requests = 2000。
内存优化策略与配置建议
PHP 进程在长期运行后,内存占用可能会逐渐增加。因此,配置需要根据服务器的可用内存进行权衡。
大内存服务器(例如 8GB 以上)
建议使用 static 模式。优点在于避免了动态创建/销毁进程的开销,性能更稳定。进程数可粗略估算为:可用内存 / 单个进程平均内存占用。例如,若单个进程占用约 30MB,8GB 内存可设置 pm.max_children = 250 左右,为系统其他服务预留足够内存。
小内存 VPS/云主机(例如 1GB)
对于 1GB 内存的服务器,强烈推荐使用 dynamic 模式。动态模式可以自动回收空闲进程,更有效地利用有限的内存资源。
配置示例(1GB 内存):
pm = dynamic
pm.max_children = 30 # 最大进程数上限
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 1000 # 建议设置,防止内存泄漏
pm.max_spare_servers 设置为 20,意味着在请求高峰时,最多保留 20 个空闲进程准备接收新请求。pm.min_spare_servers 设置为 5,确保始终有最低数量的进程待命,以快速响应突发请求。
如何估算单个 PHP-fpm 进程的内存占用?
可以使用以下命令查看当前 PHP-fpm 进程的平均内存消耗(单位:MB):
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,"M") }'
得到平均值后,即可用“总可用内存 / 单进程内存”来估算合理的 pm.max_children 值,并为系统和其他服务(如 MySQL、Nginx)预留 20%-30% 的内存。
关于 pm.max_requests 的注意事项
设置 pm.max_requests 能有效缓解因内存泄漏导致的问题,但值不宜过小。如果所有工作进程几乎同时达到重启阈值,会导致服务在短时间内出现大量进程重启,可能引发请求中断。建议设置一个较大的值(如 1000 或 2000),使得进程重启的时间点能够错开,避免对服务造成明显影响。
与 php.ini 中 memory_limit 的关联
php.ini 中的 memory_limit 参数限制了单个 PHP 脚本所能使用的最大内存。它应与 PHP-fpm 的配置协同考虑。如果脚本内存占用超过此限制,该 PHP-fpm 工作进程会被终止,可能导致 Nginx 返回 502 错误。通常,memory_limit 的值应大于你的应用程序通常所需的内存,并小于系统为单个 PHP-fpm 进程预留的内存空间。