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

How can I configure NGINX + PHP5-FPM to reserve connection slots for a specific IP range?

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

我有什么方法可以指定对来自特定 IP 范围的请求的 fastcgi 传递的限制,然后允许来自另一个 IP 范围的请求额外的 5-10 "reserved connection slots"?这就是我的想法:

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?

您可以添加另一个池,并将 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)。

例如使用 geo 模块,您可以将 /etc/nginx/conf.d/geo.conf 中的 $socket 定义为:

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