如何配置NGINX + PHP5-FPM以保留特定IP范围的连接插槽?

时间:2016-09-07 21:24:25

标签: php nginx fpm

在一些罕见的高峰用法期间,我的服务器耗尽了可用的PHP5 FPM可用子项(我无法进一步增加此数字而不会有内存不足的风险)。如果最终用户在极少数情况下收到503或504消息,但我的服务器有特定的客户端API请求,我希望确保始终可以访问某些IP地址范围,这对我来说有点可以接受。

我有什么方法可以指定对来自某些IP范围的请求的fastcgi传递限制,然后允许额外的5-10"保留连接插槽"对于来自其他IP范围的请求?这就是我的想法:

php5-fpm max children: 100
max fastcgi connections for standard IP range: 90
max fastcgi connections for "priority" IP range: 100

基本上为某些客户保留最后10个子进程。

我正在考虑尝试使用worker_connections / worker_processes来限制这些限制,但是contextevents是没有办法让它们因请求IP而异?

1 个答案:

答案 0 :(得分:2)

您可以添加另一个池,并配置nginx以将其用于保留IP。 不利的一面是,这个IP系列的客户无法使用" common"在某些用例中可能无法接受的游泳池。

基本上,如果你复制:

cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/www-special.conf   

更改套接字:

sed -i 's/listen = \/var\/run\/php5-fpm.sock/listen = \/var\/run\/php5-fpm-special.sock/g' \
    /etc/php5/fpm/pool.d/www-special.conf

并在每个文件中将pm.max_children调整为90和10:

sed -i 's/pm.max_children = .\+/pm.max_children = 90/g' \
    /etc/php5/fpm/pool.d/www.conf 

sed -i 's/pm.max_children = .\+/pm.max_children = 10/g' \
    /etc/php5/fpm/pool.d/www-special.conf 

您可以在nginx配置中为所选IP范围使用新池(不要忘记重新启动service php5-fpm restart)。

E.g。使用geo模块,您可以在$socket中将/etc/nginx/conf.d/geo.conf定义为:

geo $socket {
    default unix:/var/run/php5-fpm.sock;
    10.0.0.0/8 unix:/var/run/php5-fpm-special.sock;
}

然后更新fastcgi_pass指令以使用它:

sed -i 's/fastcgi_pass unix:\/var\/run\/php5-fpm.sock;/fastcgi_pass $socket;/g' \
    /etc/nginx/sites-available/default