我build立一个环境(在Ubuntu 10.04.02机器上)处理一个网站与许多(应该至less支持1000)子域,其中每个子域,由不同的FPM池,与不同的用户。
没有什么新鲜的 我的问题是创build(和启动)一个新的FPM池,而不必重新加载/重新启动FPM,这将导致(我知道,非常快)的停机时间。
我写了一个python守护进程,当需要的时候:
我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是添加冗余
编辑:它是很可能运行这样的设置只有一个硬件。 只需添加更多在不同IP上运行的nginx实例,并在这些实例之间创build故障转移设置即可。 如果这个选项对你的用例是有意义的,不是由我来决定的。
这听起来像你被困在资源。 为什么不在同一个硬件上运行两个Web服务器?
尝试这样的事情:
+---------------+ | nginx :80 | | / \ | | :8081 :8080 | +---------------+
通过这种方式,您的负载均衡服务(本例中为nginx)可以在两个端口之间路由。 通过这种方式,您可以随心所欲地上传或下载服务(用于更新)等。
当然你需要两个FPM池,两个用户等
对不起,我自己的问题,但我发现这个解决scheme ,正是我所期待的… 3年前;)
基本上,这个想法是每个池都有一个初始化脚本,只需要很less修改就可以像魅力一样工作。
对不起,如果我不重复这里的步骤,但真的,只是从这个链接copy'n'paste!
进一步阅读: 使用systemd的php-fpm ondemand
希望帮助别人;)