【问题标题】:How can I configure NGINX + PHP5-FPM to reserve connection slots for a specific IP range?如何配置 NGINX + PHP5-FPM 为特定 IP 范围保留连接槽?
【发布时间】:2016-09-08 08:06:46
【问题描述】:

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

我有什么方法可以指定 fastcgi 通过来自某些 IP 范围的请求的限制,然后允许额外的 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 而异?

【问题讨论】:

  • 我认为serverfault.com 会是一个更好的去处
  • 这很公平,但看起来这里有 20,000 个标记为 nginx 的问题,而那里只有 9,000 个。

标签: php nginx fpm


【解决方案1】:

您可以添加另一个池,并配置 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 模块,您可以在/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2017-04-07
    • 2014-09-27
    • 1970-01-01
    • 2015-02-02
    • 2016-02-24
    相关资源
    最近更新 更多