在一些罕见的高峰用法期间,我的服务器耗尽了可用的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
来限制这些限制,但是context
为events
是没有办法让它们因请求IP而异?
答案 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