一、名词解释
CGI是Common Gateway Interface(通用网管协议),用于让交互程序和Web服务器通信的协议。负责处理URL的请求,启动一个进程,将客户端发送的数据作为输入,有Web服务器收集程序的输出并加上合适的头部,再发送回客户端。
FastCGI是基于CGI的增强版本的协议,不同于创建新的进程来服务请求,使用持续的进程和创建的子进程来处理连串的进程,这些进程由FastCGI服务器管理,开销更小,效率更高。
PHP-FPM是PHP实现的FastCGI Process Manager(FastCGI进程管理器),用于替换PHP FastCGI的大部分功能,适用于高负载网站。支持的功能如:
1. 平滑停止/启动的高级进程管理功能
2. 慢日志记录脚本
3. 动态/静态子进程产生
4. 基于php.ini的配置文件
二、PHP-FPM配置
PHP-FPM配置文件为php-fpm.conf (例如:php-fpm容器中的/usr/local/etc/php-fpm.d/xlaravel.pool.conf)。下面所有的子进程均指php-fpm进程,可以在终端通过 ps aux |grep php 查看到。
- 显示 php-fpm: pool www 的代表work子进程(实际处理请求)
- 显示 php-fpm: process master 的代表master主进程(负责管理work子进程)
user = www-data group = www-data #启动进程的帐户和组 listen = 0.0.0.0:9000 pm = dynamic #如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由以下参数决定: pm.max_children = 20 #,子进程最大数 pm.start_servers = 45 #,启动时的进程数 pm.min_spare_servers = 30 #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程 pm.max_spare_servers = 60 #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理 request_terminate_timeout = 300 #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ’0′ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。 catch_workers_output = yes #重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
php-fpm优化参数介绍 他们分别是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。 pm:表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。 下面4个参数的意思分别为: pm.max_children:静态方式下开启的php-fpm进程数量 pm.start_servers:动态方式下的起始php-fpm进程数量 pm.min_spare_servers:动态方式下的最小php-fpm进程数 pm.max_spare_servers:动态方式下的最大php-fpm进程数量 区别: 如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。 如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。 系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程, 然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数
ps auxw|head -1;ps auxw|sort -rn -k4|head -40 # 查看消耗内存最多的前40个进程 ps -fe |grep "php-fpm"|grep "pool"|wc -l # 查看服务器上一共开了多少的 php-cgi 进程