Коды ответа HTTP 500 против 502 против 503?

Пройден через коды ответов HTTP ... и понимает, что означают эти коды ответов (rcodes)

Но я не уверен, какой rcode будет отправлен клиенту / потребителю (например, браузеру) в приведенном ниже сценарии. Я использую NGINX в качестве обратного прокси и Apache в качестве HTTP-сервера, на котором запущено веб-приложение (например, приложение) за NGINX.

Пара сценариев

  1. Ошибка выполнения возникает в приложении, которое выдает rcode как 500 (код ошибки времени выполнения по умолчанию). Насколько я понимаю, nginx будет продолжать бросать 500, а не преобразовывать его в 502?

  2. Приложение не работает или недоступно. Насколько я понимаю, в этом случае nginx выбрасывает 503, а не 502?

  3. Приложение требует больше времени для обработки, чем время ожидания соединения по умолчанию nginx. Насколько я понимаю, в этом случае nginx выдаст 504?

  4. Если все вышеперечисленные пункты верны, не уверены, когда 502 будет брошен nginx? Когда NGINX будет считать ответ, полученный от вышестоящего сервера, недопустимым?


person user3198603    schedule 11.08.2019    source источник


Ответы (1)


  1. NGINX не изменит 500 из приложения до тех пор, пока не столкнется с проблемой соединения / выборки данных из Apache. Например. Вполне возможна ситуация, когда ваше приложение сгенерирует 500, но проблема в связи NGINX с Apache приведет к другому 50x, поэтому клиент увидит 50x.

  2. Если Apache полностью не работает, вы должны получить 502 (плохой шлюз), потому что в вашей настройке Apache является шлюзом для NGINX. То же самое произойдет, если NGINX чем-то "не понравится" ответ Apache, например когда Apache отправляет ответ, заголовки которого превышают proxy_buffer_size NGINX

  3. Да, вы должны получить 504 (таймаут шлюза), когда Apache / приложение истекает по таймауту NGINX.

  4. См. Пункт 2. И следующее: NGINX будет просто передавать любой код ответа из восходящего потока (как в gateway = Apache), поэтому ему не нужно принимать во внимание, является ли данный ответ недействительным с точки зрения кодов ответа, дефолт.

Вы можете заставить NGINX принимать во внимание коды ответов об ошибках, поступающие от Apache, и действовать иначе, используя _ 2_, в сочетании с error_page , может позволить вам «переписать» коды ответов / сообщения об ошибках из Apache, например чтобы "замаскировать" отказы приложений как Service Unavailable:

error_page 500 =503 /503.html;
proxy_intercept_errors on;
person Danila Vershinin    schedule 11.08.2019
comment
Пункт 2: Вы сказали, что в вашей настройке Apache является шлюзом для NGINX. Не уверены, следует ли классифицировать NGINX как шлюз или apache как шлюз? Для браузера / клиента NGINX является шлюзом. нет? Другой момент: если сервер не работает, то кто будет генерировать 502? Также не уверен, когда будет сгенерировано 503. Согласно документу 503 создается, когда сервер не работает. - person user3198603; 12.08.2019
comment
503 может выдаваться по ряду причин, но обычно представляет собой проблему с пропускной способностью или преднамеренное обслуживание. Один случай, когда 503 используется для вещей, похожих на отказ сервера, - это установка Varnish - это программное обеспечение использует 503, когда не удается установить связь со своим шлюзом / восходящим потоком. В вашей настройке Apache является шлюзом для NGINX, а не наоборот. Другими словами, Apache - это вышестоящий сервер для NGINX. Опять же, в вашей конкретной настройке, когда NGINX отключен, клиенты будут видеть ошибки браузера, а не статус HTTP вообще ... - person Danila Vershinin; 14.08.2019
comment
... поскольку HTTP-соединение как таковое отсутствует. И если у вас работает NGINX / Apache не работает, клиенты получат 502 от NGINX. (плохой шлюз = плохой Apache). - person Danila Vershinin; 14.08.2019
comment
Спасибо. Последний вопрос по пункту 2, вы сказали If Apache is completely down, you should be getting a 502 (bad gateway), because, in your setup, Apache is the gateway for NGINX Я понимаю, что если apache не работает, а nginx работает, тогда nginix получит ошибку отказа в соединении (или что-то в этом роде) и сгенерирует код ответа 502 (или я могу сказать соединение карты отказался от ошибки с кодом ответа 502) сам. Верно ? - person user3198603; 18.08.2019
comment
Более-менее да. Если быть точным, NGINX увидит, что сетевой порт / сокет шлюза недоступен / не существует, и выдаст 502. В отличие от ситуации, когда они существуют (Apache жив), но получение каких-либо данных занимает слишком много времени. от него (тогда 504). - person Danila Vershinin; 18.08.2019