Риски включения nginx upstream keepalive

Риски включения nginx upstream keepalive

Использование nginx в качестве обратного HTTP-прокси для Apache с PHP-бэкендом (мне нужна гибкость .htaccess для веб-мастеров). Увидев http/1.0, используемый в журналах Apache, я начал искать способ включить keep-alive соединение.

В ходе поиска я нашел этот пост в блоге Nginxhttps://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives

По умолчанию NGINX открывает новое соединение с вышестоящим (бэкенд) сервером для каждого нового входящего запроса. Это безопасно, но неэффективно,[...]

Если поведение по умолчанию безопасно, каковы риски включения функции Keepalive на уровне восходящего потока?

решение1

Проксирование соединения с keepalive считается рискованным из-за атак HTTP-десинхронизации/контрабанды запросов. Это происходит, когда бэкэнд не разделяет различные клиентские запросы точно так же, как фронтэнд. Закрытие соединения после каждого запроса является «безопасным» вариантом, поскольку это четко определяет, когда текущий запрос завершился.

Видетьhttps://book.hacktricks.xyz/pentesting-web/http-request-smugglingЧтобы получить больше информации.

решение2

Как я уже говорил, KeepAlive — это оптимизация для кэширования соединения. Она нужна для поддержки трафика с высокой пропускной способностью. Я не вижу никаких рисков для ее включения, на самом деле, в любом случае она дала бы лучшие результаты.

решение3

Поведение по умолчанию, создание соединения с upstream для каждого запроса небезопасно при большой нагрузке. По следующим причинам:

  1. Как только на сервер nginx поступит запрос от того же клиента, он создаст новое соединение с вышестоящим сервером, для которого будет использоваться новый доступный локальный порт.
  2. После завершения запроса соединение на этом локальном порту перейдет из состояния «установлено» в состояние «TIME_WAIT» на 120 секунд. Это означает, что в течение 120 секунд этот локальный порт не может быть повторно использован для любого нового запроса.
  3. теперь второй запрос поступает от того же клиента, он повторяет шаг 1.
  4. таким образом, для тяжелых нагрузок,
    1. вы можете в конечном итоге использовать все доступные локальные порты на nginx (65k)
    2. Создание и завершение соединения по каждому запросу — очень затратная операция.

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

С уважением, Vj

Связанный контент