503 без следа в логах при использовании apache/wsgi

Приложение My Flask регулярно возвращает ошибку 503. Я не могу сказать причину. Может быть связано с нагрузкой. Это не систематически, так что это не проблема с правами доступа к файлам. Это больше похоже на 5 раз на 10 последующих запросов. Легко воспроизвести с помощью F5 в браузере.

Я хотел бы отладить это, но я ничего не могу найти в журналах.

Я проверил основные файлы журнала apache (доступ/ошибка) и файлы журнала доступа/ошибки VirtualHost. Я пытался установить LogLevel для отладки, но безрезультатно.

Когда приложение возвращает 503 (например, используя abort(503) с Flask), ошибка регистрируется в журнале доступа к виртуальному хосту (это не ошибка apache, поэтому она заносится в журнал доступа). Он также регистрируется в моем журнале приложений, потому что моя структура регистрирует все ошибки http.

В прошлом у меня были проблемы с загрузкой, когда ни один поток не был доступен. Это привело к 503 ошибкам, возвращенным самим apache, и я почти уверен, что они были зарегистрированы либо в журнале доступа, либо в журнале ошибок (скорее всего, ошибка).

Как это возможно, что клиент получает ошибку 503, а в журналах нет никаких следов?

Выдержка из конфигурации виртуального хоста:

    ErrorLog ${APACHE_LOG_DIR}/my-app-error.log
    CustomLog ${APACHE_LOG_DIR}/my-app-access.log combined

    WSGIDaemonProcess my-app threads=5
    WSGIScriptAlias /api /srv/my-app/application.wsgi process-group=my-app application-group=%{GLOBAL}
    WSGIPassAuthorization On

    <Location /api>
        WSGIProcessGroup my-app
    </Location>

    <Directory /srv/my-app/>
        Options FollowSymLinks
        AllowOverride All
    </Directory>

Debian Stretch, апач 2.4.25, mod_wsgi 4.5.11.

Редактировать 1: затронуты все приложения WSGi

Мы заметили ошибку 503 в другом приложении wsgi на другом виртуальном хосте в том же экземпляре apache. Это приложение находится под небольшой (близкой к нулю) нагрузкой, поэтому оно не должно 503. Однако я не получаю 503 при загрузке страницы VHost по умолчанию (страница «Apache2 Debian по умолчанию» «Это работает!» Страница) . Например, если бы существовало какое-то ограничение mod_wsgi, которое было бы общим для всех приложений WSGI, но не было бы глобальным ограничением Apache, поскольку оно затрагивает только приложения WSGI.

Изменить 2: перезапуск apache

systemctl reload apache2 ничего не меняет. Тем не менее, systemctl restart apache2 решил это на данный момент. До скорого.

Перед перезапуском

● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-12-04 11:13:23 CET; 2 weeks 0 days ago
  Process: 10023 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
  Process: 536 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 977 (apache2)
    Tasks: 133 (limit: 4915)
   Memory: 1.7G
      CPU: 6d 6h 3min 51.105s
   CGroup: /system.slice/apache2.service
           ├─  977 /usr/sbin/apache2 -k start
           ├─10066 /usr/sbin/apache2 -k start
           ├─10067 /usr/sbin/apache2 -k start
           ├─10068 /usr/sbin/apache2 -k start
           ├─10069 /usr/sbin/apache2 -k start
           ├─16834 /usr/sbin/apache2 -k start
           └─16836 /usr/sbin/apache2 -k start

После перезагрузки

● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-12-19 12:32:02 CET; 3s ago
  Process: 11840 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 11735 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
  Process: 11850 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 11854 (apache2)
    Tasks: 79 (limit: 4915)
   Memory: 125.3M
      CPU: 4.080s
   CGroup: /system.slice/apache2.service
           ├─11854 /usr/sbin/apache2 -k start
           ├─11855 /usr/sbin/apache2 -k start
           ├─11856 /usr/sbin/apache2 -k start
           ├─11857 /usr/sbin/apache2 -k start
           └─11858 /usr/sbin/apache2 -k start

Различия, которые я вижу здесь, - это количество процессов (не знаю, что об этом сказать) и использование памяти. Хорошо, приложение немного жадничает с памятью, но я думаю, что сервер справится с этим.


person Jérôme    schedule 19.12.2018    source источник
comment
У меня такая же проблема в Ubuntu 18.04.2 с libapache2-mod-wsgi 4.5.17.   -  person D. Cook    schedule 23.12.2019


Ответы (2)


В случае, если это поможет: у нас возникла аналогичная проблема с приложением flask wsgi, которое периодически возвращало 503 (скажем, каждые 5-10 запросов).

Ручное тестирование показало, что соответствующие запросы не отображались в журнале доступа apache (в то время как успешные запросы были).

Как указано в ответе обходного пути, конфигурация apache действительно также содержала конфигурации прокси для других приложений, и мы использовали ключевое слово keepalive=On для одной из наших директив ProxyPass (не для фляжного приложения, а для другого приложения, обслуживаемого с тем же префиксом). Выдержка:

    <Location /curated-cofs>
        WSGIProcessGroup curated-cofs   # this is the flask app
    </Location>

    <Location /curated-cofs/optimade>
        ProxyPass http://localhost:3759 keepalive=On timeout=1200
        ProxyPassReverse http://localhost:3759
    </Location>

На самом деле у нас не было веской причины использовать здесь ключевое слово keepalive (нет внутреннего брандмауэра).

Удаление ключевого слова из директивы ProxyPass, по-видимому, решило проблему 503 для приложения flask в качестве побочного эффекта.

person leopold.talirz    schedule 01.02.2021
comment
Эта проблема устарела, и я больше не могу ее воспроизвести, но это может помочь будущим читателям. - person Jérôme; 02.02.2021

Прежде всего, вы проверили журнал доступа? Потому что если журнала ошибок нет, это означает, что к серверу обращались, поэтому в журнале доступа должно быть что-то. Если есть, проверьте, действительно ли Flask обслуживает.

Во-вторых, вы проксируете запросы? Если вы это сделаете, убедитесь, что конфигурация вашего прокси в порядке.

И, конечно же, убедитесь, что ваша конфигурация mod_wsgi правильна.

person workaround    schedule 19.12.2018
comment
› Я проверил файлы основного журнала apache (доступ/ошибка) и файлы журнала доступа/ошибки VirtualHost. Я пытался настроить LogLevel для отладки, но безрезультатно. - person Jérôme; 19.12.2018