Назад | Перейти на главную страницу

Как добавить пул в FPM (nginx) без перезагрузки / перезапуска самого fpm?

Я создаю среду (на машине ubuntu 10.04.02) для обработки веб-сайта с множеством (должно поддерживать не менее 1000) поддоменов, каждый из которых обслуживается другим пулом FPM с другим пользователем.

Так что ничего нового; Моя проблема в том, чтобы создать (и запустить) новый пул fpm без перезагрузки / перезапуска FPM, что приведет к (я знаю, очень быстро) простою.

Я написал демон Python, который при необходимости:

  1. Создайте системного пользователя
  2. Настройте веб-корень поддоменов
  3. Создайте subdomain.conf в моей папке /etc/php5/fpm/fpm.d/

Я погуглил, но я не нашел способа вызвать 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 для нового пользователя и отложить перезагрузку сервера на более позднее время (т.е. период низкой нагрузки или когда у вас есть несколько пользователей для добавления). Это сократит время простоя, но при этом сразу вызовет поддомен нового пользователя.

Ничто из вышеперечисленного не является полностью идеальным, и единственным практическим решением проблемы отсутствия простоев будет использование нескольких серверов.

Если вы не можете позволить себе простои, единственный вариант - добавить избыточность.

  1. пусть какой-нибудь балансировщик нагрузки работает перед 2 (или более) серверами.
  2. настроить горячий резерв так, как вы хотите
  3. переключить
  4. настроить "новый" горячий резерв так, как вы хотите
  5. промывать и повторять каждый раз, когда вам нужно изменить

РЕДАКТИРОВАТЬ: вполне возможно запустить такую ​​настройку с помощью всего одного оборудования. Просто добавьте больше экземпляров nginx, работающих на разных IP-адресах, и создайте между ними настройку аварийного переключения. Имеет ли этот вариант смысл для вашего варианта использования - не мне решать.

Извините за ответ на свой вопрос, но я нашел это решение это именно то, что я искал ... 3 года назад;)

По сути, идея состоит в том, чтобы иметь сценарий инициализации для каждого пула, с небольшими изменениями, который работает как шарм.

Извините, если я не буду повторять шаги здесь, но на самом деле, это просто копирование и вставка из этой ссылки!

Дальнейшее чтение: php-fpm ondemand с помощью systemd

Надеюсь помочь кому-нибудь;)

Похоже, вам не хватает ресурсов. Почему бы не запустить два веб-сервера на одном оборудовании?

Попробуйте что-то вроде этого:

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

Таким образом, ваша служба балансировки нагрузки (в данном случае nginx) может маршрутизировать между двумя портами. Таким образом, вы можете запускать или отключать службу сколь угодно часто (для обновлений) и т. Д.

Конечно, вам понадобятся два пула FPM, два пользователя и т. Д.