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

Str*_*rae 3 nginx fastcgi php5 cgi php-fpm

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

所以没有什么新鲜事;我的问题是创建(并启动)一个新的 fpm 池,而不必重新加载/重新启动 FPM,这会导致(我知道,非常快)停机。

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

  1. 创建系统用户
  2. 设置子域的 Web 根
  3. 将 subdomain.conf 创建到我的 /etc/php5/fpm/fpm.d/ 文件夹中

我四处搜索,但没有找到使用一个池调用 fpm 的方法,这可能是一个“临时”解决方案:主 fpm 实例运行所有池,每个新实例都有自己的 fpm 实例,然后使用 cron 我停止并每周/每月/不知道重新加载 fpm

如果确实重要,服务器在 nginx 上运行,配置为使用 unix socket to 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

..和我的子域-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
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用php5-cgi和/或使用spawn-fcgi新的子域,但是有点不稳定,并且在并发级别稍微增加时经常崩溃。

任何的想法?

cyb*_*x86 5

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

我确实认为冗余是最好的方法,我相信,你可以用reload. 由于它是一个优雅的重新加载,它应该等待进程完成。

本质上,将SIGUSR2信号传递给 php-fpm,它将优雅地重新加载所有工人 + 重新加载 fpm conf/binary。

我相信这相当于

kill -USR2 `cat $php_fpm_PID`
Run Code Online (Sandbox Code Playgroud)

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

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

另一种选择是为新用户创建一个临时的 php-cgi 进程,并将重新加载服务器延迟到稍后(即低负载期,或者当您要添加多个用户时)。这将减少停机时间,但仍会立即启动新用户的子域。

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