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

Есть ли в Apache или Nginx аналог «остановки слива» IIS?

Я вырос в .NET, и в нем есть много вещей, которые мне нравятся, а также многие вещи, которые я ненавидел. В общем, IIS был одной из тех вещей, которые я ненавидел.

Однако одной действительно приятной особенностью IIS было то, что вы могли поставить «остановку слива» на своем серверном узле. Это перенаправит весь новый трафик на другие узлы, но позволит пользователям, которые в данный момент находятся в сети, завершить свои сеансы до полного выключения IIS.

Это было исключительно удобно для развертывания без прерывания пользовательских сеансов.

В моей новой компании мы не .NET, и нам это нравится. Мы работаем в JRuby и Java на EC2, используя Apache в качестве интерфейса и Tomcat в качестве серверной части.

Кто-нибудь когда-нибудь сталкивался с каким-либо решением, которое предоставляет аналогичные функции с Tomcat, Nginx или Apache?

Я немного поискал, но ничего полезного не нашел. Как насчет Axis2? У кого-нибудь есть опыт в этом?

Если вы хотите завершить работу локального сайта apache, позволяя текущим пользователям завершить свою текущую задачу, выполните изящную остановку Apache. Я предполагаю, что у вас есть другая архитектура, которая перенаправляет пользователей на другой работающий веб-сайт, чтобы позволить им продолжить (например, балансировщик нагрузки и т. Д.).

С сайта Apache:

Сигнал: WINCH apachectl -k graceful-stop

«Сигнал WINCH или graceful-stop заставляет родительский процесс посоветовать дочерним процессам выйти после их текущего запроса (или немедленно выйти, если они ничего не обслуживают). Затем родительский файл удалит свой PidFile и прекратит прослушивание на всех портах. Родитель продолжит работу и будет следить за дочерними элементами, обрабатывающими запросы. После завершения работы всех дочерних элементов или выхода из него или истечения тайм-аута, указанного в GracefulShutdownTimeout, родительский элемент также выйдет. Если истечет время ожидания, все оставшиеся дочерние элементы будут отправил сигнал TERM, чтобы заставить их выйти.

Сигнал TERM немедленно завершает родительский процесс и всех дочерних процессов, когда они находятся в "изящном" состоянии. Однако, поскольку PidFile будет удален, вы не сможете использовать apachectl или httpd для отправки этого сигнала. "

На практике просто

apache2ctl graceful

изящно перезапустит процесс apache, позволяя загрузить новую конфигурацию

Вот, например, допустим, у вас есть в производстве www.v1 и dev в www.v2

<VirtualHost *:80>
    ServerName www.example.com

    DocumentRoot /var/www/vhosts/example.com/www.v1
    [...]
</VirtualHost>

<VirtualHost *:80>
    ServerName dev.exemple.com

    DocumentRoot /var/www/vhosts/example.com/www.v2
    [...]
</VirtualHost>

Готовы к запуску разработки? Отредактируйте конфигурацию (ничего не изменится в сети, пока вы не выполните перезапуск apache / изящный, лучше посмотрите, когда произойдет ваш logrotate, он выдаст "apache2ctl graceful")

<VirtualHost *:80>
    ServerName old.example.com

    DocumentRoot /var/www/vhosts/example.com/www.v1
    [...]
</VirtualHost>

<VirtualHost *:80>
    ServerName www.exemple.com

    DocumentRoot /var/www/vhosts/example.com/www.v2
    [...]
</VirtualHost>

Когда вы почувствуете, что все готово ... скрестите пальцы, что ваша новая версия работает на новом доменном имени;)

apache2ctl graceful

И волхвов должно случиться :)

обратите внимание, что «apache2ctl graceful» автоматически выполняет «apache2ctl configtest» и не выйдет из строя, если вы сделаете очевидную ошибку в конфигурации apache.