我正在构建一个环境(在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 ~^(?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用于新的子域,但是有点不稳定,并且当并发级别增长时经常崩溃.
任何的想法?
我确实认为冗余是最好的方法,我相信,你可以通过重新加载完成你想要的.由于它是graceful reload,它应该等待进程完成.
本质上,将SIGUSR2信号传递给PHP-fpm,它将正常地重新加载所有工作人员重新加载fpm conf / binary.
我认为相当于
kill -USR2 `cat $PHP_fpm_PID`
因此,您修改conf – 并重新加载 – 不应导致明显的停机时间.
另一种选择是为每个用户运行一个进程 – 您可以在不终止现有进程的情况下添加新用户,但资源要求要高得多(并且对于1000个用户来说可能不太实用).
一个more option是为新用户创建一个临时的php-cgi进程,并延迟重新加载服务器直到稍后(即低负载期,或者你有多个用户要添加).这样可以减少停机时间,但仍会立即调出新用户的子域名.