php-fpm配置说明之一
- php
- 2018-07-30
- 7273
- 0
nginx与php交互说明
Nginx本身并不能处理PHP,只是一个web服务器的角色而已,通过cgi(通用网关接口),将php请求转发给php解释器处理。php-fpm是php版的CGI,转发方式有两种:
1、 通过TCP协议转发,
a、Nginx传递php请求到某个端口(9000),fastcgi_pass 127.0.0.1:9000;
b、php-fpm监听9000端口接受请求;2、通过socket方式交互;
php-fpm启动过程
- 读取配置文件,php.ini —> php-fpm.conf;
- 创建master监管进程,负责管理work进程;
- master进程依据读取的php-fpm配置信息,启动work进程,由work进程处理实际请求;
进程池概念
除了有php-fpm.conf配置文件,一般会通过include=/path/etc/php-fpm.d/*.conf 包含其他的conf配置文件用于配置进程池,不同的进程池可以用不同的用户执行,监听不同的端口,处理不同的任务。
初级配置字段说明
1. pid = run/php-fpm.pid
pid设置,默认在安装目录中的var/run/php-fpm.pid,保存master进程的pid,用htop、ps aux | grep php-fpm 都可以找到
2. user = www;group = www
启动进程的帐户和组
3. listen.owner = www;listen.group = www;listen.mode = 0666
unix socket设置选项,如果使用tcp方式访问,这里注释即可。
4. error_log = log/php-fpm.log
错误日志,默认在安装目录中的var/log/php-fpm.log 如果设置为syslog,log就会发送给syslogd服务而不会写进文件里。主要记录php-fpm启动、work进程开启|销毁等日志,多看看这个日志文件
5. log_level = notice
错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
6. syslog.ident = php-fpm
系统日志标示,如果跑了多个fpm进程,需要用这个来区分日志是谁的。个人理解应该是系统可以依据配置文件启动多个master进程,相互独立,即可以配置集群
7. emergency_restart_threshold = 60;emergency_restart_interval = 60s
php-fpm重启机制,表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。
8. listen = 127.0.0.1:9000
fpm监听端口,即lnmp中php处理的地址,一般默认值即可。可用格式为: ‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每个进程池都需要设置
9. listen.allowed_clients = 127.0.0.1
允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接
10. pm = dynamic
决定work进程控制方式,值为 static(静态)和dynamic(动态)。
如果是一台专门跑php的服务器,设置为static比较好,php-fpm启动时会启动由pm.max_children指定固定的子进程数。
如果选择dynamic,则由下开参数决定:pm.max_children # 子进程最大数
pm.start_servers # php-fpm启动时的work进程数
pm.min_spare_servers # 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers # 保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
pm.process_idle_timeout = 10s; #子进程闲置10s后就会被杀掉。
process.max = 128 # 当动态管理子进程时,fpm最多能fork多少个进程,0表示无限制,这是所有进程池能启动子进程的总和,谨慎使用。
11. pm.max_requests = 1000
设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ‘0’ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
12. request_terminate_timeout = 0
设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ‘0’ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。
13. request_slowlog_timeout = 10s
当一个请求超过该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 ‘0’ 表示 ‘Off’
14. slowlog = log/$pool.log.slow
慢请求的记录日志,配合request_slowlog_timeout使用,$pool 是php-fpm维护的一个变量
15. rlimit_files = 1024
设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024
设置php-fpm状态监控
配置
1、设置php-fpm配置,pm.status_path = /fpmstatus
2、设置Nginx配置,新加location模块
location /fpmstatus {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}
3、重启Nginx和php-fpm,
4、直接访问 http://webset/fpmstatus ,后边可以添加参数,json | xml | html 和 full
状态监控解释
- pool: fpm池子名称,大多数为www
- process manager: 进程管理方式,值:static, dynamic or ondemand. dynamic
- start time: 启动日期,如果reload了php-fpm,时间会更新
- start since:运行时长
- accepted conn: 当前池子接受的请求数
- listen queue:请求等待队列,如果这个值不为0,那么要增加FPM的进程数量
- max listen queue :fpm启动后,历史最高等待连接的数量
- listen queue len: 配置的监听队列最大长度 受限于listen.backlog和系统cat /proc/sys/net/core/somaxconn,两者中取最小值
- idle processes :空闲进程数量
- active processes:正在工作进程数量
- total processes:总进程数量
- max active processes:fpm启动后,历史最多同时工作的进程数
- max children reached:达到进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。即进程管理模式为 ‘dynamic’和 ‘ondemand’时,此数值是当子进程不够用时,master创建更多子进程的次数
- slow requests:启用了php-fpm slow-log,缓慢请求的数量
当添加full参数时,会显示每个work进程的情况
- pid: 进程PID
- state: 当前进程的状态 (Idle, Running, …)
- start time:进程启动的日期
- start since: 当前进程运行时长
- requests:当前进程处理了多少个请求
- request duration: 请求时长(微妙)
- request method : 请求方法 (GET, POST, …)
- request URI: 请求URI
- content length: 请求内容长度 (仅用于 POST)
- user: 用户 (PHP_AUTH_USER) (or ‘-’ 如果没设置)
- script: PHP脚本 (or ‘-’ if not set)
- last request cpu: 最后一个请求CPU使用率。
- last request memorythe: 上一个请求使用的内存
Nginx通过unixsock与php-fpm通信
适用场景:
nginx和php-fpm在同一台服务器上,这时可以直接用unixsocket进程间通信,不走tcp端口通信,可以节约创建连接的时间,从而提高性能。
配置:
1、设置php-fpm的listen为/path/php-fpm.sock(可以用相对路径),然后重启fpm就会自动创建该php-fpm.sock文件
2、nginx的fastcgi_pass参数修改为 unix:/path/php-fpm.sock; 通过php-fpm.sock文件去和fpm通信,需要保证该 php-fpm.sock 文件 nginx 有权限访问。
对比
sock文件随便创建到哪里都可以,只要fpm有权限在那个目录里写文件,nginx有权限去读就可以。
tcp连接会更稳定,因为有tcp协议保证数据的正确性,但是sock有更少的数据拷贝和上下文切换,更少的资源占用。不过只能在nginx和fpm在同一台机器上才能用sock。
总结
- Nginx多域名体系可以和php-fpm多线程池体系配合使用,使得某个域名的请求由固定的进程池去处理,互不干扰;
- 必须注意配置好php-fpm重启和work重启,防止出现内存泄漏问题;
- 如果为安全考虑,需要设置listen.allowed_clients参数
- 配置方面的东西,没有最好,只有更好,需要根据系统实际访问量和php-fpm监控情况去不断的调整,已达到更优解;