这篇的学习笔记主要讲的是LNMP环境中PHP的配置。和LAMP不同的是,在LNMP架构中,php-fpm作为独立的一个服务存在。既然是独立服务,那么它必然有自己的配置文件。php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf,它同样也支持include语句,类似于nginx.conf里面的include。
1. php-fpm配置文件
php-fpm的配置文件是php-fpm.conf,其内容如下(只是一个例子,用来说明功能的):
说明:
[global]
部分是全局配置,指定PID文件路径以及error_log路径[www]
是一个pool,其实还可以写第二个pool,第二个pool和第一个不一样的地方,首先pool的name,比如叫做[www2]
。然后listen肯定就不能一样,比如可以listen=/tmp/www2.sock
。而user
、group
也可以和[www]
中定义的不一样。listen.owner
这个是定义/tmp/www.sock
这个文件的所有者是谁,在php5.4版本之后监听的socket文件权限默认成了rw-------
,如果不定义listen.owner
,那么Nginx调用这个socket的时候就没有权限了,故在这里我们定义listen.owner
为nginx的子进程监听用户。pm = dynamic
表示以动态的形式启动,在php5.3版本以后它可以支持动态和静态了,如果是静态,即pm = static
,下面的配置只有pm.max_children
管用。pm.max_children
表示启动几个php-fpm的子进程。如果是dynamic,下面的配置会生效,pm.max_children
表示最大可以启动几个子进程。pm.start_servers
表示一开始启动几个子进程。pm.min_spare_servers
表示当php-fpm空闲时最少要有几个子进程,即如果空闲进程小于此值,则创建新的子进程。pm.max_spare_servers
表示当php-fpm空闲时最多有几个子进程,即如果空闲进程大于此值,则会进行清理。pm.max_requests
表示一个子进程最多可以接受多少个请求,比如设置为500
那么一个子进程受理500个请求后自动销毁。rlimit_files
表示每个子进程打开的多少个文件句柄。
2. php-fpm的pool
Nginx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket。现在把php-fpm.conf做一个更改,内容如下:
include这一行比较特殊,请注意等号后面的路径,必须写上etc目录。然后需要创建配置文件目录和子配置文件:
保存后,再编辑另外的配置文件:
这样就有两个子配置文件,也就是说有两个pool了,第一个pool监听了/tmp/www.sock,第二个pool监听了/tmp/aming.sock。这样,就可以在Nginx不同的虚拟主机调用不同的pool,从而达到相互隔离的目的,两个pool互不影响。
下面来验证一下配置是否有问题:
然后重启一下php-fpm服务:
再来查看/tmp/目录下面的sock文件:
3. php-fpm的慢执行日志
这一节非常重要,务必全部理解并熟练应用。
php-fpm的慢执行日志在工作中用的非常多,它可以帮助你快速地追踪到问题点。通过php-fpm的慢执行日志,我们可以非常清晰地了解到PHP的脚本哪里执行时间长,它可以定位到具体的行。
如何开启和查看php-fpm的慢执行日志呢?操作步骤如下:
上述配置说明:
- 第一行定义超时时间,即PHP的脚本执行时间只要超过1秒就会记录日志
- 第二行定义慢执行日志的路径和名字。
在以后,只要遇到PHP网站访问卡顿的问题时,要记得去查看这个慢执行日志,一定会帮助到你。
4. php-fpm定义open_basedir
在httpd的学习笔记中,已经记录了open_basedir的作用,它的目的就是为了安全。httpd可以针对每个虚拟主机设置一个open_basedir,php-fpm同样也可以针对不同的pool设置不同的open_basedir。
操作步骤如下:
只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir来物理隔离多个站点了,从而达到安全目的。
5. php-fpm进程管理
来看这一段的配置:
上述配置说明:
- 第一行,定义php-fpm的子进程启动模式。
danamic
为动态模式;一开始只启动少量的子进程,根据实际需求,动态地增加或者减少子进程,最多不会超过pm.max_children
定义的数值。- 另一种模式为
static
,这种模式下子进程数量由pm.max_children
决定,一次性启动这么多,不会减少也不会增加。
pm.start_servers
针对dynamic
模式,它定义php-fpm服务在启动服务时产生的子进程数量。pm.min_spare_servers
针对dynamic
模式,它定义在空闲时段子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。pm.max_spare_servers
也是针对dynamic
模式的,它定义在空闲时段子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。pm.max_requests
针对dynamic
模式,它定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程中最多可以处理这么多请求,当达到这个数值时,它会自动退出。