LNMP之php-fpm初始配置

这篇的学习笔记主要讲的是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,其内容如下(只是一个例子,用来说明功能的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# vim /usr/local/php-fpm/etc/php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/www.sock
listen.mode=666
user = php-fpm
group = php-fpm
listen.owner = nobody //和后面的Nginx的一致
listen.group = nobody //同上
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

说明:

  • [global]部分是全局配置,指定PID文件路径以及error_log路径
  • [www]是一个pool,其实还可以写第二个pool,第二个pool和第一个不一样的地方,首先pool的name,比如叫做[www2]。然后listen肯定就不能一样,比如可以listen=/tmp/www2.sock。而usergroup也可以和[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做一个更改,内容如下:

1
2
3
4
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf

include这一行比较特殊,请注意等号后面的路径,必须写上etc目录。然后需要创建配置文件目录和子配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# mkdir /usr/local/php-fpm/etc/php-fpm.d
[root@localhost ~]# cd /usr/local/php-fpm/etc/php-fpm.d/
[root@localhost php-fpm.d]# vim www.conf
#<==添加内容如下:
[www]
listen = /tmp/www.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

保存后,再编辑另外的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost php-fpm.d]# vim aming.conf
#<==写入如下内容:
[aming]
listen = /tmp/aming.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

这样就有两个子配置文件,也就是说有两个pool了,第一个pool监听了/tmp/www.sock,第二个pool监听了/tmp/aming.sock。这样,就可以在Nginx不同的虚拟主机调用不同的pool,从而达到相互隔离的目的,两个pool互不影响。

下面来验证一下配置是否有问题:

1
2
[root@localhost php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[07-Mar-2018 17:12:51] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

然后重启一下php-fpm服务:

1
2
3
4
5
[root@localhost php-fpm.d]# /etc/init
init/ init.d/
[root@localhost php-fpm.d]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done

再来查看/tmp/目录下面的sock文件:

1
2
[root@localhost php-fpm.d]# ls /tmp/*.sock
/tmp/aming.sock /tmp/mysql.sock /tmp/www.sock


3. php-fpm的慢执行日志

这一节非常重要,务必全部理解并熟练应用。

php-fpm的慢执行日志在工作中用的非常多,它可以帮助你快速地追踪到问题点。通过php-fpm的慢执行日志,我们可以非常清晰地了解到PHP的脚本哪里执行时间长,它可以定位到具体的行。

如何开启和查看php-fpm的慢执行日志呢?操作步骤如下:

1
2
3
4
5
[root@localhost ~]# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
#<==在后面添加如下内容
request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log

上述配置说明:

  • 第一行定义超时时间,即PHP的脚本执行时间只要超过1秒就会记录日志
  • 第二行定义慢执行日志的路径和名字。

在以后,只要遇到PHP网站访问卡顿的问题时,要记得去查看这个慢执行日志,一定会帮助到你。


4. php-fpm定义open_basedir

在httpd的学习笔记中,已经记录了open_basedir的作用,它的目的就是为了安全。httpd可以针对每个虚拟主机设置一个open_basedir,php-fpm同样也可以针对不同的pool设置不同的open_basedir。

操作步骤如下:

1
2
3
4
[root@localhost ~]# vim /usr/local/php-fpm/etc/php-fpm.d/aming.conf
#<==在最后面加入下面的内容
php_admin_value[open_basedir]=/data/www/:/tmp/

只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir来物理隔离多个站点了,从而达到安全目的。


5. php-fpm进程管理

来看这一段的配置:

1
2
3
4
5
6
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

上述配置说明:

  • 第一行,定义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的子进程中最多可以处理这么多请求,当达到这个数值时,它会自动退出。
0%