php-fpm配置说明之一

php   运维  

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启动过程

  1. 读取配置文件,php.ini —> php-fpm.conf;
  2. 创建master监管进程,负责管理work进程;
  3. 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模块

  1. location /fpmstatus {
  2. fastcgi_pass 127.0.0.1:9000;
  3. include fastcgi_params;
  4. fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
  5. }

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。

总结

  1. Nginx多域名体系可以和php-fpm多线程池体系配合使用,使得某个域名的请求由固定的进程池去处理,互不干扰;
  2. 必须注意配置好php-fpm重启和work重启,防止出现内存泄漏问题;
  3. 如果为安全考虑,需要设置listen.allowed_clients参数
  4. 配置方面的东西,没有最好,只有更好,需要根据系统实际访问量和php-fpm监控情况去不断的调整,已达到更优解;


评论 0

发表评论

Top