Выбор ответа Senior Балансировка и nginx обновлено

Повтор POST на другой бэкенд

Вопрос

Почему nginx по умолчанию не повторяет POST на следующий сервер upstream, если первый оборвал соединение после получения запроса?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: POST неидемпотентен: повтор может выполнить операцию дважды. С версии 1.9.13 nginx не повторяет неидемпотентные запросы (POST, LOCK, PATCH), если запрос уже отправлен на бэкенд, пока не указан nonidempotent в proxynextupstream.

Варианты ответа

  1. POST нельзя проксировать в upstream без явного разрешения в конфиге
  2. nginx не умеет хранить тело запроса, чтобы отправить его повторно
  3. POST неидемпотентен: повтор может выполнить операцию дваждыправильный ответ
  4. Повторы неидемпотентных запросов запрещены спецификацией HTTP/1.1

Разбор

С версии 1.9.13 nginx не повторяет неидемпотентные запросы (POST, LOCK, PATCH), если запрос уже отправлен на бэкенд, пока не указан non_idempotent в proxy_next_upstream. Сервер мог успеть выполнить действие и упасть до ответа. Безопасные повторы требуют идемпотентности на стороне приложения (ключ идемпотентности). Проксировать и буферизовать POST nginx умеет, HTTP повторы не запрещает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.