Чому налаштування Nginx як зворотного проксі є гарною ідеєю?


41

У мене на сайті Gjanicorn працює Django із зворотним проксі через Nginx. Хіба Nginx не є лише зайвою непотрібністю? Як додати, що додає Гунікорна?

Відповіді:


53

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

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

У вашій ситуації ви маєте справу з клієнтами з високою затримкою через Інтернет. Ці повільні клієнти можуть пов'язати ті самі процеси. Якщо питання QPS має значення, код програми повинен отримувати, обробляти та вирішувати запит якомога швидше, щоб він міг перейти до іншого запиту. Коли повільні клієнти спілкуються безпосередньо з вашою системою, вони пов’язують цей процес і сповільнюють його. Замість того, щоб обробляти запит і розпоряджатися якомога швидше, цей процес тепер також повинен чекати повільного клієнта. Ефективна QPS знижується.

Робота з великою кількістю з'єднань з дуже невеликою витратою процесора та пам'яті - це те, чим добре допомагають асинхронні сервери типу Nginx. На них не впливають так само негативно, як повільні клієнти, оскільки вони вміло поводяться з великою кількістю клієнтів одночасно. У випадку з Nginx, працює на сучасному апаратному забезпеченні, він може обробляти десятки тисяч підключень одночасно.

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


3
nitpicking: gunicorn - це сервер, що базується на заходах. кожен процес обробляє декілька з'єднань асинхронно. Це не змінює той факт, що nginx має меншу вартість за з'єднання, що робить решту вашого пояснення дійсними.
Хав’єр

4
І як бонус, Nginx дуже ефективно зупиняє "Повільні атаки HTTP DoS". Я хотів би додати, що при використанні Nginx він може зіпсувати будь-які речі, пов'язані з IP, які ви можете робити в Gunicorn, наприклад, auth шляхом ip, ведення журналів тощо. Я не знайомий з Гунікорном, тому не можу сказати, наскільки це велике питання для вас.
Niall Donegan

Дякую за інформацію Хав'єр, я не більше, ніж пристрасно знайомий з кулеметом.
blueben

Ваша відповідь повинна відповідати на це питання: stackoverflow.com/q/13182892/719276
arthur.sw

Чи має це щось спільне з параметром * _busy_buffer_size?
CMCDragonkai

2

@blueben має рацію. Конкретний і поширений приклад того, що може статися, коли зворотний проксі-сервер не використовується, - це те, що база даних із заднім числом може запускати ручки підключення до бази даних, де немає проксі-сервера і є стрибок трафіку. Це пов'язано з повільним вивільненням з'єднань, як описано @blueben.

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

Nginx також чудово обслуговує статичний вміст, кешування та різноманітні інші завдання HTTP, дозволяючи вашому серверу додатків зосередитись на тому, щоб бути сервером додатків.


0

@naill Donegan згадує це у коментарі вище, але це досить важливо, щоб гарантувати відповідь.

Nginx зупиняє повільну атаку лоріса, з якою не справляється гуморіг.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.