php-fpm.conf配置文件中文说明详解及重要参数说明

php-fpm工作流程

php-fpm全名是PHP FastCGI进程管理器

php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。

启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。

当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;

这个存放待accept的半连接的队列有多长,由 listen.backlog 配置。

php-fpm全局配置说明

配置里面的所有相对路径,都是相对于php的安装路径。

除了有php-fpm.conf配置文件外,通常还有其他的*.conf配置文件(也可以不要,直接在php-fpm.conf配置)用于配置进程池,不同的进程池可以用不同的用户执行,监听不同的端口,处理不同的任务;多个进程池共用一个全局配置。

include=/opt/remi/php56/root/etc/php-fpm.d/*.conf 载入其他的配置文件。

php-fpm全局配置参数中文说明:

pid = /opt/remi/php56/root/var/run/php-fpm/php-fpm.pid 
#pid进程文件,默认为none。

error_log = /opt/remi/php56/root/var/log/php-fpm/error.log 
#错误日志位置,默认:安装路径 #INSTALL_PREFIX#/log/php-fpm.log。如果设置为syslog,log就会发送给syslogd服务而不会写进文件里。

syslog.facility = daemon 
#把日志写进系统log,linux还不够熟悉,暂时不用理会。

syslog.ident = php-fpm 
#系统日志标示,如果跑了多个fpm进程,需要用这个来区分日志是谁的。

log_level = notice 
#日志等级,默认notice,可选:alert, error, warning, notice, debug

emergency_restart_threshold = 60 
#配合下面emergency_restart_interval参数

emergency_restart_interval = 60s 
#如果在此参数设置的时间内,出现SIGSEGV或SIGBUS的子进程数超过emergency_restart_threshold参数设置的值,那么fpm就会优雅的重启,值是0表示off这个功能,可用的单位有:s秒,m分,h时,d天。

process_control_timeout = 0 
#设置子进程接受主进程复用信号的超时时间。这个每天明白,是过了这个时间就不能复用了?

process.max = 128 
#当动态管理子进程时,fpm最多能fork多少个进程,0表示无限制,这是所有进程池能启动子进程的总和,谨慎使用。

process.priority = -19 
#设置子进程的优先级,在master进程以root用户启动时有效;如果没有设置,子进程会继承master进程的优先级,值范围-19(最高)到20(最低),默认不设置。

daemonize = yes 
#设置成no用于调试bug,默认为yes。

rlimit_files = 1024 
#设置master进程最多能打开的文件,默认为系统的值。

rlimit_core = 0 
#master进程核心rlimit限制值;可选unlimited或>=0的整数,默认为系统的值。

events.mechanism = epoll 
#事件处理机制,默认自动检测,可选值:select,poll,epoll(linux>=2.5.44),kqueue,/dev/poll,port

systemd_interval = 10s 
#当fpm被设置为系统服务时,多久向服务器报告一次状态,单位有s,m,h。

php-fpm进程池配置 pool Definitions:

在不同的监听端口和不同的管理选项下可以跑任意数量的池,并没有个数限制;

池的名字用于 logs 和 stats。

user = apache

group = apache

#以什么用户什么组的权限来运行池fpm。

用apache可以像httpd服务一样去访问某些目录

listen = 127.0.0.1:9000 
#监听的ip和端口,可以 /path/to/unix/socket 来监听unix socket,性能更好。

listen.backlog = 65535 
#未accept处理的socket队列大小,-1 on FreeBSD and OpenBSD,其他平台默认65535,高并发时重要,合理设置会及时处理排队的请求;太大会积压太多,处理完后nginx在前面都等超时断开这个和fpm的socket连接了,就杯具了。不要用-1,建议1024以上,最好是2的幂值。

#一个池共用一个backlog队列,所有的池进程都去这个队列里accept连接。

#最大数量受限于系统配置 cat /proc/sys/net/core/somaxconn,系统配置修改:vim /etc/sysctl.conf,增加 net.core.somaxconn = 2000 则最大为2000,然后php最大的backlog可以到2000。

listen.owner = apache

listen.group = apache

listen.mode = 0660

#用socket连接方式时,指定拥有unix socket权限的用户,默认和运行的用户一样;用tcp连接可以注释掉

listen.allowed_clients = 127.0.0.1 
#设置允许连接fpm的地址,比如nginx就要来连,多个地址用逗号隔开,如果不配置,则默认任意地址都能来连。

process.priority = -19 
#池进程的权限,同样要master进程是root用户才有效,和全局那个一样,不设置的话会继承master进程的优先级。

pm = dynamic 
#启动时子进程管理方式,可选值:static(启动时创建指定个数), dynamic(启动时根据情况创建,至少有一个), ondemand(启动时不创建子进程,有需求才创建)

pm.max_children = 5 
#该池同时最多存在5个进程, 三种管理方式都要配置

pm.start_servers = 2 
#fpm启动时创建2个子进程,只适用动态dynamic管理方式

pm.min_spare_servers = 2 
#服务器闲置时最少保持2个子进程,不够这个数就会创建,只适用动态dynamic管理方式

pm.max_spare_servers = 3 
#服务器闲置时最多要有几个,多了会kill,只适用动态dynamic管理方式

pm.process_idle_timeout = 10s
#子进程闲置10s后就会被杀掉。

pm.max_requests = 500 
#每个子进程最大处理500请求就被回收,可防止内存泄露。

pm.status_path string

#FPM 状态页面的网址。如果没有设置,则无法访问状态页面,默认值:无。

ping.path string

#FPM 监控页面的 ping 网址。如果没有设置,则无法访问 ping 页面。该页面用于外部检测 FPM 是否存活并且可以响应请求。请注意必须以斜线开头(/)。

ping.response string
#用于定义 ping 请求的返回响应。返回为 HTTP 200 的 text/plain 格式文本。默认值:pong。

process.priority int
#设置 worker 的 nice(2)优先级(如果设置了的话)。 该值从 -19(最高优先级) 到 20(更低优先级)。 默认值:不设置

prefix string
#检测路径时使用的前缀

access.log = var/log/$pool.access.log 
#访问文件日志,没啥用处,比如yii2每次都记录访问index.php,只是记录真实的PHP文件。

slowlog = var/log/$pool.log.slow 
#PHP文件执行过慢的日志,会准确的记录具体哪一行代码太慢,这个非常有用,在设置了时间时生效。

request_slowlog_timeout = 2s 
#超过这个运行时间就会写慢日志

request_terminate_timeout = 3s 
#单个请求的超时时间,有时候php.ini设置的最大执行时间未生效,这个就会来干掉那个执行太久的请求。

rlimit_files = 1024 
#最大打开句柄数,默认为系统值。

rlimit_core = 0 
#最多的核心使用数,默认为系统分配。

chroot = /path 
#路径必须是绝对路径,改变子进程的跟目录,可以把进程对文件系统的读写与实际的操作系统文件系统隔离,对安全有好处。

chdir = /var/www

#改变当前工作目录,可以用相对路径,默认是当前目录或者chroot。

catch_workers_output = yes 
#重定向标准输出stdout和标准错误stderr到主错误日志,如果不设置,这两个日志就会定向到/dev/null,在高负载情况下,这个配置会引起页面延迟几毫秒,默认不开启。

clear_env = no 
#创建work进程时是否清除环境变量,如果是yes,那么该子进程 getenv() 就访问不到 $_ENV 和$_SERVER 了。

security.limit_extensions = .php .php3 .php4 .php5 
#为了安全,限制能执行的脚本后缀

#为当前池指定另外的 php.ini 配置,比如指定当前池的错误日志写在哪个地方

php_value/php_flag 
#可以设置php.ini的内容,可以被ini_set覆盖

php_admin_value/php_admin_flag 
#这个同上,但是不会被ini_set覆盖。

#其中flag设置的,值只能是on, off, 1, 0, true, false, yes or no,其他类型的值需要用value。

php_flag[display_errors] = off

php_admin_value[error_log] = /var/log/fpm-php.www.log

php_admin_flag[log_errors] = on

php_admin_value[memory_limit] = 32M

#这种方法设置 `disable_functions` 和 `disable_classes` 时,不会覆盖 php.ini 的设置,只会追加。

注意:PHP配置值通过 php_value 或者 php_flag 设置,并且会覆盖以前的值。
disable_functions 或者 disable_classes 在 php.ini 之中定义的值不会被覆盖掉,但是会将新的设置附加在原有值的后面。
使用 php_admin_value 或者 php_admin_flag 定义的值,不能被 PHP 代码中的 ini_set() 覆盖。

自 5.3.3 起,也可以通过 web 服务器设置 PHP 的设定。

nginx 通过 unixsock 与 php-fpm 通信:

适用场景:nginx和php-fpm在同一台服务器上,这时可以直接用unixsocket进程间通信,不走tcp端口通信,可以节约创建连接的时间,从而提高性能。

1、设置php-fpm的listen为/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock(可以用相对路径),然后重启fpm就会自动创建该php567-fpm.sock文件

2、nginx的fastcgi_pass参数修改为 unix:/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock; 通过php567-fpm.sock文件去和fpm通信,需要保证该 php567-fpm.sock 文件 nginx 有权限访问。

总结:

sock文件随便创建到哪里都可以,只要fpm有权限在那个目录里写文件,nginx有权限去读就可以。tcp连接会更稳定,因为有tcp协议保证数据的正确性,但是sock有更少的数据拷贝和上下文切换,更少的资源占用。不过只能在nginx和fpm在同一台机器上才能用sock。

php-fpm进程状态监控

1、nginx配置:遇到 status 的请求,直接转发给php

location ~^/status$ {

fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

include fastcgi_params;

fastcgi_pass 127.0.0.1:9000;

}

2、fpm配置:pm.status_path = /status

3、然后重新fpm和nginx,在浏览器里访问就能看到了:

默认以 text/plain 展示结果,可以传参数 ?json/html/xml 分别得到json等格式的结果;参数full可以查看每个子进程的明细

pool 进程池名称

process manager 进程管理方式

start time 进程什么时候启动的

start since 进程已经运行了多少秒

accepted conn 该池总共accept了多少连接

listen queue 等待accept的连接的数量

max listen queue fpm启动后,历史最高等待accept的连接的数量

listen queue len 配置的监听队列最大长度 受限于`listen.backlog`和系统`cat /proc/sys/net/core/somaxconn`,两者中取最小值

idle processes 闲置的进程数

active process 正在工作的进程数(加上限制的,就是总的子进程数)

total processes 总的子进程数量

max active processes fpm启动后,历史最多同时工作的进程数

max children reached 进程管理模式为 'dynamic'和 'ondemand'时,此数值是当子进程不够用时,master创建更多子进程的次数

slow requests 慢请求个数

full参数下

pid 子进程ID;

state 子进程状态(Idle, Running, ...);

start time 子进程启动的时间;

start since 子进程启动后运行了多少秒;

requests 当前子进程一共处理了多少个请求;

request duration 请求耗费的纳秒数;

request method 请求方法 (GET, POST, ...);

request URI 请求参数;

content length POST请求时,请求的内容长度;

user - the user (PHP_AUTH_USER) (or '-' if not set);

script 请求的哪个php文件;

last request cpu 上次请求耗费的cpu资源

last request memory 上次请求耗费的内存峰值

如果进程是闲置状态,那这些信息记录的就是上次请求的相关数据,否则就是当前本次请求的相关数据。

backlog配置问题

一个fpm子进程在同一时间只能处理一个请求,如果,backlog设置得过大,nginx之类的客户端发起的请求一直没有fpm子进程进行accept,nginx就会直接断掉这个连接,等fpm忙过来了再去accept的时候,就会发现断开了,于是报错。backlog设置得过小,访问量大时fpm子进程全部处于忙碌状态,backlog也塞满了,就会拒绝新的连接,此时nginx再请求,就会直接被拒。所以需要合理的设置backlog参数。

大部分参数只要系统默认的就可以了,我们只需要知道几个比较重要的参数设置,什么时候用到可以回头查询相关说明

(0)

相关推荐

  • nginx php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)

    很多站长转到nginx+php-fpm后,饱受500,502问题困扰.当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时. php-fpm.conf的配置文件中有一个参数request_slowlog_timeout是这样描述的 复制代码 代码如下: ; The timeout for serving a single request after which a PHP backtrace will be; dumped to the 'sl

  • php-fpm配置详解

    php5.3自带php-fpm 复制代码 代码如下: /usr/local/php/etc/php-fpm.conf pid = run/php-fpm.pidpid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log错误日志,默认在安装目录中的var/log/php-fpm.log log_level = notice错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告

  • nginx+php-fpm配置文件的组织结构介绍

    1.nginx的配置文件路径 一般来说,安装nginx的时候,配置文件的默认路径是 /usr/local/nginx/conf/nginx.conf. 我们可以使用一个链接文件,将conf目录指向一个特定目录,以方便管理.例如,笔者所在的公司喜欢将所有的服务器配置文件集中在/home/server_config中,然后在该目录中新建一个子目录 nginx,再将/usr/local/nginx/conf 通过链接文件指向/home/server_config/nginx. 2.Virtual ho

  • 基于php-fpm的配置详解

    php5.3自带php-fpm/usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log错误日志,默认在安装目录中的var/log/php-fpm.log log_level = notice错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一

  • nginx php-fpm环境中chroot功能的配置使用方法

    nginx+php-fpm是现在配置php环境非常流行的组合之一.nginx以其并发能力强,轻巧,速度快而受到非常多人的青睐,php-fpm以其安全,处理php速度快而成为与nginx的最佳组合.php-fpm提供有一个非常重要的功能chroot,它可以把指定的网站完完全全限制在一个目录下,可以对系统和其它虚拟机起到很好的隔离效果,这对系统的安全无疑是加强了不少,下面介绍如何配置. 我们假设域名为www.jb51.net,网站根目录为/home/chroot/www.jb51.net/web,需

  • Linux系统下PHP-FPM的安装和配置教程

    基本安装方法 安装工具包 $ sudo apt-get install python-software-properties 添加ppa源 $ sudo add-apt-repository ppa:yola/php5 安装php5-fpm sudo apt-get update sudo apt-get install php5-fpm 其它必要的软件安装接 sudo apt-get install nginx 配置php-fpm php-fpm的解析器是C/S结构,它的配置文件位于: (1)

  • CentOS6 配置Nginx,MySql,php-fpm开机启动的方法

    一. Nginx 开机启动 1.在/etc/init.d/目录下创建脚本 vim /etc/init.d/nginx 2.编写脚本内容 (将以下复制进去相应改动安装路径) #!/bin/bash # nginx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: - 85 15 # description: Nginx is a high-performance web and proxy

  • php配置php-fpm启动参数及配置详解

    约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini一,php-fpm的启动参数 复制代码 代码如下: #测试php-fpm配置/usr/local/php/sbin/php-fpm -t/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.con

  • 详解Linux下安装php环境并且配置Nginx支持php-fpm模块

    以下以CentOS 7.2为例,安装php的运行环境,首先打开php官网http://php.net/点击导航栏的Downloads进入下载页面:http://php.net/downloads.php 这里下载最新版的php 7.0.5 的源码包: 下载下来之后上传至服务器 因为php安装需要编译,所以服务器应该保证gcc和g++环境的安装 首先释放安装包: tar -xvzf php-7.0.5.tar.gz cd php-7.0.5 接下来进行参数配置,配置前如果没有libxml2和lib

  • /etc/php-fpm.d/www.conf 配置注意事项

    1.php-fpm 配置文件里 rlimit_files的值 要与系统的打开连接数一致 1)查看系统文件打开连接数 [root@iZ94eveq0q4Z ~]# ulimit -n 65535 2)查看一下php-fpm 配置文件里 rlimit_files的值 ; Set open file descriptor rlimit#rlimit设置打开的文件描述符 ; Default Value: system defined value rlimit_files = 65535 如果两个值不一样

  • php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?

    什么是CGI CGI全称是"公共网关接口"(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行"交谈"的一种工具,其程序须运行在网络服务器上. CGI可以用任何一种语言编写,只要这种语言具有标准输入.输出和环境变量.如php,perl,tcl等 什么是FastCGI FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-

  • 实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法

    nginx与apache不一样,在apache中可以直接指定php的错误日志,那样在php执行中的错误信息就直接输入到php的错误日志中,可以方便查询. 在nginx中事情就变成了这样:nginx只对页面的访问做access记录日志.不会有php的error log 信息.nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog. 原因是php-fpm的配

  • nginx调用php-fpm出错解决方法和nginx配置详解

    装完了nginx和php-5.5,配置好了nginx调用php后,就开始启动php-fpm. 使用下面的命令 复制代码 代码如下: /usr/local/php/sbin/php-fpm 就可以启动了. 在nginx的目录中创建个php的检测脚本index.php 结果在打开http://localhost/index.php 悲剧的发现居然无法打开 .查看日志文件,看了下报错原因 复制代码 代码如下: 2013/07/01 22:34:26 [error] 3214#0: *64 FastCG

  • 安装配置php-fpm来搭建Nginx+PHP的生产环境

    nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx 本文以php-fpm为例介绍如何使nginx支持PHP 一.编译安装php-fpm 什么是PHP-FPM PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到. P

  • linux下的php-fpm参数配置介绍与参数优化说明

    php-fpm.conf重要参数详解 pid = run/php-fpm.pid #pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log #错误日志,默认在安装目录中的var/log/php-fpm.log log_level = notice #错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息).

  • ubuntu10.04配置 nginx+php-fpm模式的详解

    ppa安装php-fpm安装工具包 复制代码 代码如下: $ sudo apt-get install python-software-properties 添加ppa源 复制代码 代码如下: $ sudo add-apt-repository ppa:yola/php5 安装php5-fpm 复制代码 代码如下: sudo  apt-get  updatesudo  apt-get install  php5-fpm 其它必要的软件安装接 复制代码 代码如下: sudo   apt-get  

随机推荐