PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器。它提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。日常运维中,我们主要将PHP-FPM 的配置文件分为主配置文件和 pool配置文件(每个pool配置文件通常对应一个Nginx虚拟主机)。
配置位置
只可在业务逻辑层上配置,主要使用nginx的ngx_http_fastcgi_module模块。七层代理层不配置。
PHP-FPM 主配置文件
主配置文件 php-fpm.conf,常用配置如下:
[global]
pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log
process_control_timeout = 0
# 动态方式下开启的php-fpm进程的最大数量
process.max = 2048
# 设置 fpm 在后台运行
daemonize = yes
# 设置进程可以打开的文件描述符数量
rlimit_files = 65535
# 设置core dump 的大小
rlimit_core = 67108864
# 设置FPM 的事件处理机制
events.mechanism = epoll
# emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过
emergency_restart_threshold个,php-fpm就会优雅重启
emergency_restart_threshold = 10
emergency_restart_interval = 5
# 加载pool 配置
include = /etc/fpm.d/*.conf
PHP-FPM pool 配置文件
PHP-FPM pool 配置文件,常用配置如下(example test.xqwin.com.conf):
[test.xqwin.com]
user = www
group = www
listen = 127.0.0.1:9000
# 允许监听的客户端
listen.allowed_clients = 127.0.0.1
# 设置动态进程池
pm = dynamic
pm.max_children = 512
pm.start_servers = 32
pm.min_spare_servers = 32
pm.max_spare_servers = 64
# 设置每个进程可处理的请求数,当进程达到这个请求数量后会自动释放在重新生成新的进程。避免内存泄漏等情况
pm.max_requests = 1500
# FPM 的监控设置
pm.status_path = /xqwin_monitor_page
# PHP-FPM 的慢请求日志位置。$pool 这里为 test.xqwin.com
slowlog = /data0/www/logs/$pool-slow_log
# 设置请求时间达到多少位慢请求
request_slowlog_timeout = 3
# 终止请求超时时间。一个请求若处理大于20s ,则会自动kill 掉。避免进程堆积
request_terminate_timeout = 20
catch_workers_output = no
# 限制 FPM 允许解析的脚本扩展名. 这里不限制,FPM可以解析任何扩展名的文件
security.limit_extensions = ""
虚拟主机结合PHP-FPM pool
PHP-FPM pool 配置
[test.xqwin.com]
user = www
group = www
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 512
pm.start_servers = 32
pm.min_spare_servers = 32
pm.max_spare_servers = 64
pm.max_requests = 1500
pm.status_path = /xqwin_monitor_page
slowlog = /data0/www/logs/$pool-slow_log
request_slowlog_timeout = 3
request_terminate_timeout = 20
catch_workers_output = no
security.limit_extensions = ""
虚拟主机配置
server {
listen 80;
server_name test.xqwin.com;
root /data0/www/htdocs/test.xqwin.com;
access_log /var/log/nginx/test.xqwin.com-acess.log;
error_log /var/log/nginx/test.xqwin.com-error.log;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html)$ {
expires 1d;
}
location / {
# 确保 fastcgi.conf 中存在 SCRIPT_FILENAME 配置
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
# 使用了PHP-FPM 9000 端口的POOL 配置。
fastcgi_pass 127.0.0.1:9000;
}
}
测试
在test.xqwin.com 的虚拟主机root 目录中创建一个today.php 的脚本。
# cat today.php
<?php
echo "today is " . date("Y-m-d") . "\n";
?>
# curl http://127.0.0.1/today.php -H "HOST: test.xqwin.com"
pool: test.xqwin.com
process manager: dynamic
start time: 02/Jun/2018:08:59:15 -0400
start since: 129
accepted conn: 6
listen queue: 0
max listen queue: 0
listen queue len: 128
idle processes: 31
active processes: 1
total processes: 32
max active processes: 1
max children reached: 0
slow requests: 0
注释如下
# PHP-FPM 的POOL名字
pool: test.xqwin.com
# 这个POOL中进程管理方式,这里是动态管理方式。相反还有静态管理方式。
process manager: dynamic
# POOL从什么时间开始启动
start time: 02/Jun/2018:08:59:15 -0400
# POOL 从启动到现在已经存活了多久
start since: 129
# 当前POOL接受的请求数
accepted conn: 6
# 请求等待队列当前长度,如果这个值不为0,那么说明你的请求处理已经开始有挤压了,应该注意系统状态。
listen queue: 0
# 从启动到现在,请求等待队列历史最大长度
max listen queue: 0
# 请求队列长度大小
listen queue len: 128
# 目前空闲进程数
idle processes: 31
# 目前工作进程数
active processes: 1
# 目前总进程数
total processes: 32
# 从启动到现在,最大的活跃进程数量
max active processes: 1
# 达到进程最大数量限制的次数,如果这个数量不为0,那说明设置的最大进程数量(pm.max_children)太小了,或者进
程挤压了。
max children reached: 0
# 慢请求的数量
slow requests: 0