Я работаю в приложении SaaS, созданном с помощью Django (Python) и работающем с Apache / mod_wsgi.
На сайте регистрации создаются файлы конфигурации виртуального хоста apache, wsgi и файлы настроек. И, наконец, перезапускает сервер apache.
Это означает, что каждый раз, когда новый пользователь регистрирует учетную запись, apache перезапускается, и это влияет на производительность приложения для текущих клиентов.
Возможный вариант - создать отдельный экземпляр apache для новых клиентов, но это слишком увеличит объем оперативной памяти, необходимой для всех клиентов.
Какие рекомендации вы можете дать по этому поводу?
Побочным эффектом нескольких экземпляров является то, что все они также не могут работать на одном порту.
Возможно, ваш сценарий может выполнить «apachectl configtest», чтобы сначала убедиться, что конфигурация действительна (помогая предотвратить ее запуск из-за ошибки в конфигурации).
А затем запустите apachectl graceful.
apachectl изящный: Изящно перезапускает демон Apache, отправив ему SIGUSR1. Если демон не запущен, он запускается. Это отличается от обычного перезапуска тем, что открытые в данный момент соединения не прерываются. Побочным эффектом является то, что старые файлы журналов не закрываются немедленно. Это означает, что при использовании в сценарии ротации журналов может потребоваться значительная задержка, чтобы гарантировать, что старые файлы журналов закрыты перед их обработкой. Эта команда автоматически проверяет файлы конфигурации с помощью configtest перед запуском перезапуска, чтобы убедиться, что Apache не умирает.
apachectl configtest: Запустить проверку синтаксиса файла конфигурации. Он анализирует файлы конфигурации и сообщает Syntax Ok или подробную информацию о конкретной синтаксической ошибке.
Вы обнаружите, что с Apache / mod_wsgi он привязан к версии Django. Итак, если у вас есть код Python 2 с mod_wsgi2, вам понадобится отдельный экземпляр httpd с mod_wsgi3, если у вас также есть код Python 3.
Я не знаю, насколько точным должно быть совпадение, но я думаю, что мне сказали ожидать появления еще одного экземпляра Apache, как только мы завершим переход с 2 на 3, а затем на 3. следующий. Добавьте к этому и другим конфликтам модулей в том же поле для некоторого другого промежуточного программного обеспечения, и в этом поле в настоящее время есть три экземпляра httpd.
Надеюсь, ваш сайт будет избыточным, и вы сможете перезапускать одну сторону за раз. Вы должны мультиплексировать между сайтами с помощью обратного прокси, возможно, httpd с чем-то вроде mod_cluster.
А что насчет пространства процессов внутри mod_wsgi? Изолированы ли два клиента друг от друга безопасным образом, если ими управляет один и тот же экземпляр httpd?
Если бы у меня был выбор, я бы, возможно, пошел бы с развертыванием FastCGI .... Я думаю, что Django может это сделать (с пулеметом?), Но мы уже давно не смотрели, и не я смотрел .
Надеюсь, это поможет.
Наверное, это перебор, но у меня есть хитрый план. :-)
Настройте правило iptables, например:
iptables -t nat -i PREROUTING -m tcp -p tcp --dport 80 -j DNAT --to-destination :81
Пусть Apache работает на порту 81. Входящие соединения для порта 80 будут перенаправлены на порт 81.
Теперь, когда вы получите новую конфигурацию, сохраните ее в отдельном месте и пусть она прослушивает порт 82. Теперь вы можете попробовать запустить второй экземпляр Apache. Если он не запускается, вы знаете, что у вас есть проблема с конфигурацией, и можете продолжать работу со старой конфигурацией, пока она не будет решена.
Если он запускается, замените приведенное выше правило iptables правилом, указывающим на порт 82. Существующие соединения будут продолжать идти к старому порту, пока они не будут завершены. Дайте им период отсрочки перед выключением старого экземпляра. Таким образом вы запускаете совершенно новый экземпляр и закрываете старый, но не прерывая пользователей. Затем вы можете сделать то же самое со следующей конфигурацией, вернувшись к порту 81.
Возможно, вам нужен apachectl graceful, но если это не сработает, это может быть другой вариант.