如何添加池到FPM(nginx)没有重新加载/重新启动fpm本身?

我build立一个环境(在Ubuntu 10.04.02机器上)处理一个网站与许多(应该至less支持1000)子域,其中每个子域,由不同的FPM池,与不同的用户。

没有什么新鲜的 我的问题是创build(和启动)一个新的FPM池,而不必重新加载/重新启动FPM,这将导致(我知道,非常快)的停机时间。

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

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

我search了一下,但我没有find一种方法来调用fpm使用一个池,这可能是一个'临时'的解决scheme:主要的fpm实例运行所有的池,evey新的获得自己的fpm实例,然后用cron停止,每周/每月/ dontknowyet重新加载fpm

如果没关系,服务器运行在nginx上,configuration为使用unix socket到fcgi,这是我的nginxtestingconfiguration:

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到新的子域,但是有点不稳定,并且在并发级别增长的时候经常崩溃。

任何想法?

我不相信有没有什么办法可以添加一个池,而无需重新启动/重新加载(按照这个 )。

我认为冗余是最好的办法,我相信,你可能会完成你想要的reload 。 由于这是一个优雅的重新加载,它应该等待进程完成。

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

我相信这相当于

 kill -USR2 `cat $php_fpm_PID` 

所以,你修改conf并重新加载 – 不应该导致明显的停机时间。

另一个select是为每个用户运行一个进程 – 您可以添加新用户而不终止现有进程,但资源要求要高得多(并且对于超过1000个用户来说不太可行)。

还有一个select是为新用户创build一个临时的php-cgi进程,并延迟重新加载服务器,直到稍后(即低负载期,或者当你有多个用户添加时)。 这将减less停机时间,但仍会立即提出新用户的子域名。

以上都不是完全理想的,唯一可行的解​​决scheme就是多服务器方式。

如果您无法承受任何停机时间,唯一的select是添加冗余

  1. 让一些负载平衡器在2个(或更多)服务器前运行。
  2. 以您想要的方式configuration热备份
  3. 切换
  4. 以您想要的方式configuration“新”热备份
  5. 而且每当你需要改变的时候重复

编辑:它是很可能运行这样的设置只有一个硬件。 只需添加更多在不同IP上运行的nginx实例,并在这些实例之间创build故障转移设置即可。 如果这个选项对你的用例是有意义的,不是由我来决定的。

这听起来像你被困在资源。 为什么不在同一个硬件上运行两个Web服务器?

尝试这样的事情:

 +---------------+ | nginx :80 | | / \ | | :8081 :8080 | +---------------+ 

通过这种方式,您的负载均衡服务(本例中为nginx)可以在两个端口之间路由。 通过这种方式,您可以随心所欲地上传或下载服务(用于更新)等。

当然你需要两个FPM池,两个用户等

对不起,我自己的问题,但我发现这个解决scheme ,正是我所期待的… 3年前;)

基本上,这个想法是每个池都有一个初始化脚本,只需要很less修改就可以像魅力一样工作。

对不起,如果我不重复这里的步骤,但真的,只是从这个链接copy'n'paste!

进一步阅读: 使用systemd的php-fpm ondemand

希望帮助别人;)