2

在一些罕见的高峰使用期间,我的服务器用完了可用的 PHP5 FPM 可用子级(我不能进一步增加这个数字,而不会冒着内存不足的风险)。如果最终用户在极少数情况下收到 503 或 504 消息,我在某种程度上可以接受,但我想确保某些 IP 地址范围始终可以访问我的服务器的特定客户端 API 请求。

我有什么办法可以指定 fastcgi 通过来自某些 IP 范围的请求的限制,然后为来自另一个 IP 范围的请求允许额外的 5-10 个“保留连接插槽”?这就是我的想法:

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 而异吗?

4

1 回答 1

2

您可以添加另一个池,并将 nginx 配置为将其用于保留 IP。缺点是来自此 IP 范围的客户端无法使用“公共”池,这在某些用例中可能是不可接受的。

基本上,如果你复制:

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)。

例如,使用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
于 2016-09-08T00:06:46.117 回答