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,效果如下
查看php-fpm进程
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
然后查看一下是否有生成日志文件,这个时候日志文件是空的:
接下来模拟一个慢执行的php,需要写一个脚本:
vim /usr/local/nginx/html/sleep.php
脚本内容如下:
使用curl对这个脚本进行访问
访问完后查看慢日志
其中第二行可以看出是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不在同一台机器上时,只能使用这种方式。
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。