如何在不重新加载/重启fpm本身的情况下将池添加到FPM(nginx)?

我正在构建一个环境(在ubuntu 10.04.02机器上)来处理一个包含许多(应该支持至少1000个)子域的网站,每个子域由不同的FPM池和不同的用户提供服务.

没什么新鲜的;我的问题是创建(并启动)一个新的fpm池而不必重新加载/重启FPM,这将导致(我知道,真的很快)停机.

我写了一个python守护进程,需要时:

>创建系统用户
>设置子域的Web根目录
>在我的/etc/php5/fpm/fpm.d/文件夹中创建subdomain.conf

我google了但我没有找到一种方法来调用fpm使用一个池,这可能是一个“临时”的解决方案:主fpm实例运行所有池,evey新的一个得到他自己的fpm实例,然后与一个cron我停止和每周/每月重新加载fpm / dontknowyet

如果重要,服务器在nginx上运行,配置为使用unix socket到fcgi,这是我的nginx测试配置:

server{
    listen          80;
    server_name     ~^(?<domain>.+)\.test\.local$; # foo.test.local > myapp_foo
    root            /var/www/myapp/subdomains/myapp_$domain/htdocs;
    location / {
        index index.php;
    }
    location ~* \.(gif|jpg|png|ico)${
        expires 30d;
    }
    location ~ \.php${
        fastcgi_pass    unix:/var/web-sock/myapp_$domain-fpm.sock;
        fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
}

..和我的子域-fpm.conf:

[myapp_foo]
listen = /var/web-sock/myapp_foo-fpm.sock

user = myapp_foo
group = myapp_foo

pm = dynamic
pm.max_children = 30
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 30

我已经尝试将php5-cgi和/或spawn-fcgi用于新的子域,但是有点不稳定,并且当并发级别增长时经常崩溃.

任何的想法?

最佳答案
我不相信有任何方法可以在不重新启动/重新加载的情况下添加池(根据this).

我确实认为冗余是最好的方法,我相信,你可以通过重新加载完成你想要的.由于它是graceful reload,它应该等待进程完成.

本质上,将SIGUSR2信号传递给php-fpm,它将正常地重新加载所有工作人员重新加载fpm conf / binary.

我认为相当于

kill -USR2 `cat $php_fpm_PID`

因此,您修改conf – 并重新加载 – 不应导致明显的停机时间.

另一种选择是为每个用户运行一个进程 – 您可以在不终止现有进程的情况下添加新用户,但资源要求要高得多(并且对于1000个用户来说可能不太实用).

一个more option是为新用户创建一个临时的php-cgi进程,并延迟重新加载服务器直到稍后(即低负载期,或者你有多个用户要添加).这样可以减少停机时间,但仍会立即调出新用户的子域名.

以上都不是完全理想的,没有停机的唯一实用解决方案是多服务器方法.

转载注明原文:如何在不重新加载/重启fpm本身的情况下将池添加到FPM(nginx)? - 代码日志