Почему установка Nginx в качестве обратного прокси-сервера - хорошая идея?

42

У меня есть сайт Django, работающий на Gunicorn с обратным прокси через Nginx. Разве Nginx - это просто лишние лишние издержки? Как поможет добавление этого поверх Gunicorn?

Тот самый
источник

Ответы:

53

Я собираюсь сосредоточиться на медленном поведении клиента и на том, как ваша конфигурация справляется с этим, но не поддавайтесь искушению полагать, что это единственное преимущество. Тот же метод, который дает преимущества медленным клиентам, также имеет преимущества для быстрых клиентов, обработки SSL, работы с скачками трафика и других аспектов обслуживания HTTP в Интернете.

Gunicorn - это программное обеспечение для предварительного разветвления. Для коммуникаций с малой задержкой, таких как балансировка нагрузки на сервер приложений или связь между службами, системы предварительного разветвления могут быть очень успешными. Нет необходимости в ускорении процесса обработки запроса, и один процесс может быть выделен для обработки одного запроса; устранение этих вещей может привести к созданию более быстрой и более эффективной системы, пока количество одновременных соединений не превысит число доступных процессов для их обработки.

В вашей ситуации вы имеете дело с клиентами с высокой задержкой через Интернет. Эти медленные клиенты могут связать те же процессы. Когда QPS имеет значение, код приложения должен получать, обрабатывать и разрешать запрос как можно быстрее, чтобы он мог перейти к другому запросу. Когда медленные клиенты связываются напрямую с вашей системой, они связывают этот процесс и замедляют его. Вместо того, чтобы обрабатывать и удалять запрос как можно быстрее, этот процесс теперь также должен ждать медленного клиента. Эффективная QPS снижается.

Обработка большого количества соединений с очень малыми затратами ресурсов процессора и памяти - вот что хорошо для асинхронных серверов, таких как Nginx. Медленные клиенты на них не влияют одинаково негативно, потому что они умеют обрабатывать большое количество клиентов одновременно. В случае Nginx, работающего на современном оборудовании, он может обрабатывать десятки тысяч соединений одновременно.

Nginx перед сервером предварительной разветвления - отличная комбинация. Nginx управляет связью с клиентами и не подвергается штрафам за обработку медленных клиентов. Он отправляет запросы к бэкэнду так быстро, как бэкэнд может обработать эти запросы, позволяя бэкэнду быть максимально эффективным с ресурсами сервера. Бэкэнд возвращает результат, как только вычисляет его, и Nginx буферизует этот ответ, чтобы передать его медленным клиентам в своем собственном темпе. Между тем, серверная часть может перейти к обработке другого запроса, даже если медленный клиент все еще получает результат.

blueben
источник
3
nitpicking: gunicorn - это сервер для предварительной обработки событий. каждый процесс обрабатывает несколько соединений асинхронно. Это не меняет того факта, что nginx имеет гораздо более низкую цену за соединение, что делает остальные объяснения верными.
Хавьер
4
И в качестве бонуса, Nginx очень эффективно останавливает «Slow HTTP DoS Attacks». Единственное, что я хотел бы добавить, это то, что при использовании Nginx он может испортить любую информацию, связанную с IP, которую вы могли бы делать в Gunicorn, например, авторизацию по ip, ведение журнала и т. Д., Если Gunicorn не поддерживает поиск заголовка X-Forwarded-For. Я не знаком с Gunicorn, поэтому не могу сказать, насколько серьезной будет эта проблема для вас.
Найл Донеган
Спасибо за информацию Хавьер, я не более чем мимолетно знаком с Gunicorn.
blueben
Ваш ответ должен соответствовать этому вопросу: stackoverflow.com/q/13182892/719276
arthur.sw
Это как-то связано с опцией * _busy_buffer_size?
CMCDragonkai
2

@blueben прав. Конкретный и распространенный пример того, что может произойти, если обратный прокси-сервер не используется, - это то, что во внутренней базе данных могут быть запущены дескрипторы подключения к базе данных, когда прокси-сервер отсутствует и наблюдается всплеск трафика. Это связано с медленным освобождением соединений, как описано @blueben.

Первый инстинкт видеть, что дескрипторы базы данных заканчиваются, может заключаться в поддержке большего количества соединений с базой данных. Но добавив обратный прокси-сервер перед приложением, вы увидите, что количество требуемых соединений с базой данных для высокой нагрузки значительно снижается и стабилизируется - уровень соединения с базой данных не будет резко расти почти так же, когда наблюдается скачок трафика.

Nginx также отлично справляется со статическим контентом, кэшированием и множеством других задач HTTP, позволяя вашему серверу приложений сосредоточиться на том, чтобы быть сервером приложений.

Марк Стосберг
источник
0

@naill Donegan упоминает об этом в комментарии выше, но это достаточно важно, чтобы оправдать ответ.

Nginx останавливает медленную атаку лориса, с которой не справляется gunicorn.

rox0r
источник