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

Изящная остановка Apache в ожидании запросов на перезапись

Я использую Apache в качестве обратного прокси и mod_rewrite для передачи запросов серверным службам для обработки.

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

Я протестировал следующее: сначала у меня есть базовый цикл, заворачивающий мою службу:

for (( i=1; i <= 200; ++i )); do curl -s -o /dev/null -w "%{http_code}" https://example.com/api?request=$i | sed "s/^/\n${i} /"; done;

Я прикрепляю индекс запроса к URL-адресу, чтобы я мог отслеживать запросы повсюду, затем я выключаю apache, используя сигнал WINCH (я вижу, как он регистрирует получение правильного сигнала, так что рад, что отправлено нормально)

Затем я вижу, например, что когда он выключается, цикл curl выводит:

97 200
98 502

Если затем я посмотрю журналы Apache, последний зарегистрированный запрос соответствует этому - последний зарегистрированный запрос в Apache - это запрос 97, возвращающий 200 OK (тогда я вижу сообщение журнала завершения работы). Однако, если я перейду к серверной службе, я могу увидеть в журналах, что запрос 98 прошел, а базовая служба вернула ответ 200, но это никогда не возвращается моему клиенту curl, поскольку они получают 502.

Я пробовал использовать как RewriteRule, так и ProxyPass (прокси отлично работает с этой конфигурацией, только не с изящным элементом)

RewriteRule ^/api/(.*) @backend_service@api/$1 

или

ProxyPass /api/ @backend_service@api/

(backend_service - это просто токенизированное значение, вставляется позже, но все работает там)

Есть идеи, как я могу гарантировать, что эти прокси-запросы будут выполнены до изящного выключения?