Я создаю среду (на машине ubuntu 10.04.02) для обработки веб-сайта с множеством (должно поддерживать не менее 1000) поддоменов, каждый из которых обслуживается другим пулом FPM с другим пользователем.
Так что ничего нового; Моя проблема в том, чтобы создать (и запустить) новый пул fpm без перезагрузки / перезапуска FPM, что приведет к (я знаю, очень быстро) простою.
Я написал демон Python, который при необходимости:
Я погуглил, но я не нашел способа вызвать fpm с использованием одного пула, что могло бы быть `` временным '' решением: основной экземпляр fpm запускает все пулы, каждый новый получает свой собственный экземпляр fpm, затем с помощью cron я останавливаюсь и перезагружать fpm каждую неделю / месяц / dontknowyet
Если имеет значение, сервер работает на nginx и настроен на использование сокета unix для 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
к новым поддоменам, но он немного нестабилен и часто дает сбой, когда уровень параллелизма немного увеличивается.
Любая идея?
Я не верю, что есть способ добавить пул без перезапуска / перезагрузки (согласно этот).
Я действительно думаю, что избыточность - лучший подход к этому, я действительно верю, что вы можете достичь того, что хотите, с reload
. Поскольку это изящная перезагрузка он должен дождаться завершения процессов.
По сути, пройти SIGUSR2
сигнал на php-fpm, и он корректно перезагрузит всех рабочих + перезагрузит файл fpm conf / binary.
Я считаю, что это составляет
kill -USR2 `cat $php_fpm_PID`
Таким образом, вы изменяете конфигурацию - и перезагружаете - не должны приводить к заметным простоям.
Другой вариант - запустить один процесс для каждого пользователя - вы можете добавлять новых пользователей, не завершая существующие процессы, но требования к ресурсам значительно выше (и для 1000+ пользователей вряд ли будут практичными).
Один дополнительная опция состоит в том, чтобы создать временный процесс php-cgi для нового пользователя и отложить перезагрузку сервера на более позднее время (т.е. период низкой нагрузки или когда у вас есть несколько пользователей для добавления). Это сократит время простоя, но при этом сразу вызовет поддомен нового пользователя.
Ничто из вышеперечисленного не является полностью идеальным, и единственным практическим решением проблемы отсутствия простоев будет использование нескольких серверов.
Если вы не можете позволить себе простои, единственный вариант - добавить избыточность.
РЕДАКТИРОВАТЬ: вполне возможно запустить такую настройку с помощью всего одного оборудования. Просто добавьте больше экземпляров nginx, работающих на разных IP-адресах, и создайте между ними настройку аварийного переключения. Имеет ли этот вариант смысл для вашего варианта использования - не мне решать.
Извините за ответ на свой вопрос, но я нашел это решение это именно то, что я искал ... 3 года назад;)
По сути, идея состоит в том, чтобы иметь сценарий инициализации для каждого пула, с небольшими изменениями, который работает как шарм.
Извините, если я не буду повторять шаги здесь, но на самом деле, это просто копирование и вставка из этой ссылки!
Дальнейшее чтение: php-fpm ondemand с помощью systemd
Надеюсь помочь кому-нибудь;)
Похоже, вам не хватает ресурсов. Почему бы не запустить два веб-сервера на одном оборудовании?
Попробуйте что-то вроде этого:
+---------------+
| nginx :80 |
| / \ |
| :8081 :8080 |
+---------------+
Таким образом, ваша служба балансировки нагрузки (в данном случае nginx) может маршрутизировать между двумя портами. Таким образом, вы можете запускать или отключать службу сколь угодно часто (для обновлений) и т. Д.
Конечно, вам понадобятся два пула FPM, два пользователя и т. Д.