nginx中php-fpm的多进程池

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,这样就可以了

猜你喜欢

转载自wsluozefeng.iteye.com/blog/2255912
今日推荐