php-fpm多个进程池
说明:
每个池使用不同的配置,各个池之间互不干涉。默认情况下,PHP 只启用了一个池,所有请求均在这个池中执行。一旦某些请求出现拥堵之类的情况,那么很可能会连累整个池出现问题;如果启用多个池,那么可以把请求分门别类放到不同的池中执行,此时如果某些请求出现拥堵之类的情况,那么只会影响自己所在的池,从而控制故障的波及范围。
设置多个进程池,每个进程池分配不同的站点,可以做到一个站占用资源过多导致其它站也不能访问的尴尬情况。这使得网站可以更好的运行,如果某个站点受到少量CC攻击,也不至于拖跨所有的站点
第一步:php-fpm的配置:
在php-fpm.conf中默认只有[www]这一个pool(进程池),假设如果需要新增一个叫ajia的进程池,可以添加下面配置:(这里的配置可以自行增减,但是[ajia]的字眼是必须有的)
[ajia]
user=nobody ;可以使用别的用户、用户组
group=nobody
;listen=127.0.0.1:9001 ;可以使用tcp或者unix socket的方式,但是必须区别于其他池的配置,比如tcp的端口不能一样,socket的文件不能一样
listen = /dev/shm/php-fpm0.socket
pm=dynamic ;当pm=dynamic,pm.max_children不使用,但是值也一定要存在,当pm=static,只使用pm.max_children
pm.max_children=10
pm.start_servers=2
pm.min_spare_servers=1
pm.max_spare_servers=10
pm.process_idle_timeout=15
第二步:nginx中配置:
在对应的fastcgi模块配置中的fastcgi_pass的值设置成新增的ajia的进程池
fastcgi_pass unix:/dev/shm/php-fpm0.socket;
或者
fastcgi_pass 127.0.0.1:9001;
最后:重启nginx和php-fpm之后生效,使用 ps -ef | grep php-fpm 可以查看到会出现2个不同的进程池的fpm进程
一般不会把fastcgi_pass定义到特定的某一个进程池中,而是定义到一个upstream上游服务器集合中,这个upstream已经将不同的php-fpm进程池包含了,设置如下:
在http配置块中添加upstream:
upstream fzjh{
server unix:/dev/shm/php-fpm0.socket weight=1; #weight设置权重,这个是新增的ajia的进程池
server 127.0.0.1:9000 weight=2; #这个是默认的www的进程池
}
fastcgi_pass的值修改为fzjh即可,这样每次的php-fpm处理连接时候会轮询不同的进程池,哪怕其中一个进程池挂掉了,也不会影响其他池的php进程
上面这种方式的进程池是基于php-fpm本身的效果,用一个php-fpm的master进程带动,另一种方式是起多个php-fpm的master进程,这个多个master进程对应的连接nginx方式不同(socket文件或者端口不同)
第一步:使用多个php-fpm配置文件,例如使用php-fpm1.conf、php-fpm2.conf
php-fpm1.conf中的listen配置为unix:/dev/shm/php-fpm1.socket,其他的配置看情况配置
php-fpm2.conf中的listen配置为unix:/dev/shm/php-fpm2.socket
第二步:启动2个php-fpm的master进程,通过-y带上php-fpm配置文件的形式:
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm1.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm2.conf
重启nginx和php-fpm后,使用 ps -ef | grep php-fpm 可以查看到2个不同的master,这样就可以了