Выбор ответа Senior Балансировка и nginx обновлено
Повтор POST на другой бэкенд
Вопрос
Почему nginx по умолчанию не повторяет POST на следующий сервер upstream, если первый оборвал соединение после получения запроса?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: POST неидемпотентен: повтор может выполнить операцию дважды. С версии 1.9.13 nginx не повторяет неидемпотентные запросы (POST, LOCK, PATCH), если запрос уже отправлен на бэкенд, пока не указан nonidempotent в proxynextupstream.
Варианты ответа
- POST нельзя проксировать в upstream без явного разрешения в конфиге
- nginx не умеет хранить тело запроса, чтобы отправить его повторно
- POST неидемпотентен: повтор может выполнить операцию дваждыправильный ответ
- Повторы неидемпотентных запросов запрещены спецификацией HTTP/1.1
Разбор
С версии 1.9.13 nginx не повторяет неидемпотентные запросы (POST, LOCK, PATCH), если запрос уже отправлен на бэкенд, пока не указан non_idempotent в proxy_next_upstream. Сервер мог успеть выполнить действие и упасть до ответа. Безопасные повторы требуют идемпотентности на стороне приложения (ключ идемпотентности). Проксировать и буферизовать POST nginx умеет, HTTP повторы не запрещает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.