mod_wsgi В режиме DaemonProcess возникает проблема с изящной перезагрузкой httpd - PullRequest
0 голосов
/ 22 декабря 2018

Я использую httpd -k graceful для динамической перезагрузки моего сервера, и я использую time.sleep в коде Python для медленного запроса, и я ожидал, что активные запросы не будут прерваны после перезагрузки apache.Но это так.

Итак, я попробовал простой Python-сервер с использованием CGI, он работает хорошо.Затем я попробовал mod_wsgi, используя процесс apache (только с указанием WSGIScriptAlias), и он тоже работает хорошо.

Так что я обнаружил, что проблема заключается в WSGIDaemonProcess, который я изначально использовал.

Затем в документе mod_wsgi я нашел это:

eviction-timeout = sss

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

Если этот тайм-аут не указан, то значение graceful-timeoutвместо этого будет использоваться.Если время отсрочки не указано, то перезапуск при отправке сигнала постепенного перезапуска произойдет немедленно, при этом процесс принудительно завершается, если необходимо, по истечении времени ожидания выключения.

когдаЯ подумал, что найду причину, я обнаружил, что эти аргументы (и я тоже пробовал graceful-timeout) вообще не работали. Запросы все еще прерывались из-за изящной перезагрузки.Так почему?

Я использую apache 2.4.6, с режимом mpm preforkmodwsgi 4.6.5, я сам скомпилировал его и заменил на него мою старую версию mod_wsgi.so.

1 Ответ

0 голосов
/ 22 декабря 2018

ответ от GrahamDumpleton @ Github: (https://github.com/GrahamDumpleton/mod_wsgi/issues/383)

То, что вы видите, в точности соответствует ожиданиям. Apache не передает изящные сигналы перезапуска в управляемые подпроцессы, он только передает их в свои дочерние рабочие процессыДля управляемых процессов будет отправлено SIGTERM, и он будет зверски убивать их через 3 или 5 секунд (точно не помню, сколько времени), если они не выключены. Обойти это невозможно. Это ограничениеApache.

Таким образом, тайм-аут выселения применяется только в том случае, если документы говорят, когда «процессу демона» отправляется изящный сигнал перезапуска напрямую, то есть перезапуск Apache в целом изящно ничего не делает, но отправляетсигнал постепенного перезапуска на pid самих процессов-демонов.

Таким образом, единственное решение, если это поведение важно, - убедиться, что вы используете опцию display-name для директивы WSGIDaemonProcess, чтобы процессы-демоны назывались уникально по сравнению сApache обрабатывает, а затем посылает сигналы на них только напрямую.

Обычно это oЭто становится проблемой, потому что некоторые системы Linux полностью игнорируют тот факт, что Apache имеет очень хорошую систему ротации файлов журналов, и вместо этого выполняют внешнюю ротацию файлов журналов, переименовывая файлы журналов один раз в день, а затем пытаются выполнить постепенный перезапуск.Люди увидят проблемы с прерванными запросами, которых они не ожидают.В этом случае вам следует использовать собственный механизм ротации файлов журнала Apache, если это важно, и не полагаться на внешние системы ротации файлов журнала.

...