php-fpm配置pool,慢日志以及通信方式比较(2)

php-fpm常用配置

php-fpm的pool

php-fpm的pool是这个php-fpm服务的池子,php-fpm支持定义多个池子,能够监听多个不同的sock或者监听不同的ip。如果Nginx上跑了几个站点,每个站点都可以配置一个pool,当其中一个站点的php报502或者其他错误了,那么其他的站点就不会受到影响。如果全部站点都使用同一个pool的话,当其中一个php出问题了,那么全部的站点都会瘫掉,所以需要每个站点配置一个pool,把这些站点都隔离开来。

配置pool

配置pool可以在php-fpm的主配置文件里添加以下内容:

vim /usr/local/php-fpm/etc/php-fpm.conf
include = /usr/local/php/etc/php-fpm.d/*.conf

再在/usr/local/php/etc/php-fpm.d/目录下创建子配置文件

这里创建aaa.conf、bbb.conf、ccc.conf三个子配置文件,分别配置如下:

[aaa.com]
user = aaa
group = aaa
listen = 192.168.112.203:9001
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 30
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 15
pm.status_path = /status
ping.path = /ping
request_terminate_timeout = 20
catch_workers_output = no
security.limit_extensions = ""
[bbb.com]
user = bbb
group = bbb
listen = 192.168.112.203:9002
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 30
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 15
pm.status_path = /status
ping.path = /ping
request_terminate_timeout = 20
catch_workers_output = no
security.limit_extensions = ""
[ccc.com]
user = ccc
group = ccc
listen = 192.168.112.203:9003
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 30
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 15
pm.status_path = /status
ping.path = /ping
request_terminate_timeout = 20
catch_workers_output = no
security.limit_extensions = ""

配置nginx虚拟主机

nginx虚拟主机配置如下

1. server {
        listen       80;
        server_name  aaa.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~ \.php$ {
            root           html;
            fastcgi_pass   192.168.112.203:9001;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        }
2.  server {
        listen       80;
        server_name  bbb.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~ \.php$ {
            root           html;
            fastcgi_pass   192.168.112.203:9002;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        }
3.  server {
        listen       80;
        server_name  ccc.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~ \.php$ {
            root           html;
            fastcgi_pass   192.168.112.203:9003;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        }

为每个站点配置一个pool,效果如下

1.png

查看php-fpm进程

2.png

php-fpm慢日志

php-fpm的慢执行日志是一个很有用的东西,如果需要做php的网站,建议使用lnmp架构,因为我们可以去分析php-fpm的慢执行日志,有用户反馈网站的访问速度变慢了,所以我们得知道访问慢的根本原因,才能去解决这个访问慢的问题。如果是php网站,就可以通过慢执行日志去分析原因,所以才说php-fpm的慢执行日志是一个很有用的东西。

下面用示例介绍一下如何配置慢执行日志:

vim /usr/local/php/etc/php-fpm.d/aaa.conf
request_slowlog_timeout = 1 #定义超过一秒钟就要记录日志
slowlog = /usr/local/php/var/log/ccc-slow.log #定义日志的存放位置

完成后重启php-fpm

然后查看一下是否有生成日志文件,这个时候日志文件是空的:

3.png

接下来模拟一个慢执行的php,需要写一个脚本:

vim /usr/local/nginx/html/sleep.php

脚本内容如下:


使用curl对这个脚本进行访问

4.png

访问完后查看慢日志

5.png

其中第二行可以看出是sleep.php这个脚本执行时间长

第三行可以看出sleep.php这个脚本的第三行语句执行慢

再分析下脚本,第三行sleep(2)语句执行了一个线程休眠,休眠了2秒钟,而我们定义的是超过1秒就记录日志,所以记录了这个脚本访问慢的原因。

所以这就是慢执行日志的作用,能够帮我们记录访问慢的原因。不过一般正常情况下定义为2秒才记录日志会比较好,因为很多的脚本执行由于硬件或框架的原因,都会导致执行时间超过1秒。

nginx通过tcp、socket连接php-fpm方式对比

什么是Unix domain socket?

Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流。Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。

Unix domain sockets 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。所以两个进程可以同时打开一个Unix domain sockets来进行通信。不过这种通信方式是发生在系统内核里而不会在网络里传播。

修改php-fpm配置文件

vim /usr/local/php/etc/php-fpm.d/aaa.conf

添加以下内容:

listen = /dev/shm/php-fpm.a.sock

描述符文件可以放在系统的任意位置,如果想要更快的通信速度,可以放在/dev/shm下面,这个目录是tmpfs,是RAM可以直接使用的区域,所以,读写速度都会很快。

listen.mode = 0666

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

修改nginx配置文件

vim /usr/local/nginx/conf/nginx.conf

添加以下内容

fastcgi_pass unix:/dev/shm/php-fpm.a.sock;

两种通信方式的分析和总结

从原理上来说,unix socket方式肯定要比tcp的方式快而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。

当然还是从原理上来说,unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。而TCP这样的面向连接的协议,多少可以保证通信的正确性和完整性。

如果是在同一台服务器上运行的nginx和php-fpm,并发量不超过1000,选择unix socket,因为是本地,可以避免一些检查操作(路由等),因此更快,更轻。

unix socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。这种方式需要再nginx配置文件中填写php-fpm的pid文件位置,效率要比tcp 高。

tcp 的优点是可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式。

版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。

你可能感兴趣的:(php-fpm配置pool,慢日志以及通信方式比较(2))