本文属笔记,不算原创
php-fpm 配置
下面配置项的注释,是或摘或借鉴,有的没找到的。我翻译文档了(安装默认的一个www.conf.defaulf。每一项上面都会有对应的英文说明。)。
这些配置对应的struct 在./sapi/fpm/fpm/fpm_conf.h
[sock0]
listen = /dev/shm/php-fpm-7.0.sock ;指定sock通讯的文件地址 or listen = 0.0.0.0:9000
listen.allowed_clients = 127.0.0.1 ;允许访问FastCGI进程的IP址
listen.backlog = 51200 ;跟tcp有关。参考[《TCP SOCKET中backlog参数的用途是什么?》](https://www.cnxct.com/something-about-phpfpm-s-backlog/)
listen.owner = nobody ;启动进程的用户
listen.group = nobody ;启动进程的组
listen.mode = 0660 ;用socket连接方式时,指定拥有unix socket权限的用户,默认和运行的用户一样;用tcp连接可以注释掉
user = nobody
group = nobody
pm = dynamic ;fpm 进程管理的三种模式 ,选项有static、dynamic、ondemand(按需模式)
pm.max_children = 256 ;子进程最大数
pm.start_servers = 10 ;启动时进程最大数
pm.min_spare_servers = 5 ;保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers = 10 ;保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_requests = 51200 ;设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
pm.status_path = /php-fpm-7-status ;FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none.
ping.path = /heart ;FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
ping.response = check_ok ;用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
request_terminate_timeout = 10 ;设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0′ 表示 ‘Off'.
当经常出现502错误时可以尝试更改此选项。
request_slowlog_timeout = 5 ;当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0′ 表示 ‘Off'
slowlog = /home/nobody/logs/php-fpm-7/www-slow.log ;慢请求的记录日志,配合request_slowlog_timeout使用
php_admin_value[error_log] = /app/webserver/logs/php-fpm-7/www-error.log ;可以覆盖php.ini的配置。你可以在一个php脚本里 输出phpinfo()然后看下配置的值。就明白了。另外文档中也说了这个配置不会被ini_set 覆盖。
php_admin_flag[log_errors] = on
rlimit_files = 102400 ;设置文件打开描述符的rlimit限制. 默认值: 系统定义值
系统默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
上面pm = dynamic
是配置进程的管理方式。有三种:
-
静态模式(static):启动时master根据pm.max_children 配置fork出相应数量的worker进程,也就是worker进程数是固定不变是
-
动态模式(dynamic):这种模式比较常用,fpm启动根据pm.start_servers 配置初始化一定数量的worker。运行期间master发现空闲worker数低于pm.min_spare_servers配置数(表示请求比较多,worker处理不过来)会fork worker进程,但总的worker数不能超过pm.max_children;如果master发现空闲worker数超过了pm.max_spare_servers(表示闲着的worker太多了)会杀掉一些worker,避免占用过多资源,master通过这4个值动态控制worker的数量。
-
按需模式(ondemand):这种模式很像传统的cgi,在启动时不分配worker进程,等到有请求了后再通知master进程fork worker进程,来了请求后再fork子进程进行处理,总的worker数不超过pm.max_children,处理完后worker进程不会立即退出,当空闲时间超过pm.process_idle_timeout后再退出。
monitor php-fpm
可以方便zabbix 监控
我根据这篇《Nginx – Enable PHP-FPM Status Page》配置。curl yan.com/status 为空白。根据这篇《How to Enable and Monitor PHP-FPM Status in Nginx》 对照了下少了一行fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
[root@bogon php-fpm.d]# curl yan.com/status
pool: www
process manager: dynamic
start time: 01/Apr/2019:23:19:44 +0800
start since: 5
accepted conn: 1
listen queue: 0
max listen queue: 0
listen queue len: 128
idle processes: 9
active processes: 1
total processes: 10
max active processes: 1
max children reached: 0
slow requests: 0
参考资料:
-
《Nginx – Enable PHP-FPM Status Page》https://easyengine.io/tutorials/php/fpm-status-page
-
《php-fpm.conf 全局配置段》https://www.php.net/manual/zh/install.fpm.configuration.php
-
《How to Enable and Monitor PHP-FPM Status in Nginx》https://www.tecmint.com/enable-monitor-php-fpm-status-in-nginx/
-
《基于php-fpm的配置详解》https://www.jb51.net/article/37749.htm
-
《启用php-fpm状态详解》http://www.ttlsa.com/php/use-php-fpm-status-page-detail/
-
《TCP SOCKET中backlog参数的用途是什么?》https://www.cnxct.com/something-about-phpfpm-s-backlog/
-
《php7内核剖析》秦朋
-
《php-fpm.conf配置文件中文说明详解及重要参数说明》http://www.360doc.com/content/18/1023/17/13328254_795049788.shtml
网友评论