Замовлення: 1. nginx 2. лак 3. haproxy 4. веб-сервер?


50

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

nginx:

  • ssl: так
  • компрес: так
  • кеш: так
  • резервний басейн: так

лак:

  • ssl: ні (оглушення?)
  • компрес:?
  • кеш: так (основна особливість)
  • резервний басейн: так

гапрокси:

  • ssl: ні (оглушення)
  • компрес:?
  • кеш: ні
  • резервний пул: так (основна особливість)

Чи є намір об'єднати все це перед основними веб-серверами лише для того, щоб отримати деякі їх основні переваги?

Здається, досить крихким є те, що стільки демонів струмують, роблячи подібні речі.

Яке вподобання для розгортання та замовлення та чому?


1
Тепер лак має підтримку SSL: див. Blog.exceliance.fr/2012/09/10/…
MiniQuark

4
Ви ментант сказати HAProxy?
Луїс Лобо Боробія

У Nginx, здається, є все, тому я б сказав просто використовувати nginx.
Seun Osewa

Відповіді:


60

Простіше кажучи ..

HaProxy - найкращий балансир навантаження на відкриті ресурси на ринку.
Лак - найкращий статичний файл-сховище з відкритим кодом на ринку.
Nginx - найкращий відкритий сервер на ринку.

(звичайно, це моя та багато інших народів)

Але загалом не всі запити проходять через весь стек.

Все проходить через haproxy та nginx / кілька nginx.
Єдина відмінність - ви "підкручуєте" лак для статичних запитів.

  • будь-який запит врівноважується для надмірності та пропускної здатності (добре, це масштабованість надмірності)
  • будь-який запит на статичні файли спочатку потрапляє в кеш лаку (добре, це швидко)
  • будь-який динамічний запит прямує до бекенда (чудово, лак не звикне)

В цілому ця модель підходить для масштабованої та зростаючої архітектури (зніміть haproxy, якщо у вас немає декількох серверів)

Сподіваюся, це допомагає: D

Примітка. Насправді я також запроваджую Pound для SSL-запитів: D У
вас може бути сервер, призначений для розшифровки запитів SSL та передачі стандартних запитів до резервного стека: D (Це робить весь стек швидшим і простішим)


1
Дуже цікава, особливо частина про сервер дешифрування. +1
Геррі

Дивовижна відповідь. Мені цікаво, що сидить перед усім? Це HAProxy чи Nginx?
Джон,

2
@John: [Клієнт -> HAProxy -> Лак -> Nginx -> Статичний контент] або [Клієнт -> HAProxy -> Nginx (необов'язково) -> Сервер додатків (динамічний контент)]
MiniQuark

2
Чому б ви кешували статичні та обслуговували динамічні? Nginx - це блискавка для обслуговування статичних файлів. Я вважаю за краще використовувати стек типу [ HAProxy-> Nginx] для статики та [ HAProxy-> Nginx-> Varnish-> Apache] для реалізації кешу на динаміці. Припинення SSL на балансирі навантаження, як ви заявили, з виділеними кінцевими вузлами.
Стів Бузонас

33

Передмова

Оновлення в 2016 році. Все розвивається, всі сервери стають все кращими, всі вони підтримують SSL та Інтернет більш дивовижно, ніж будь-коли.

Якщо не зазначено, наступне спрямоване на професіоналів у бізнесі та стартапах, підтримуючи тисячі мільйонів користувачів.

Ці інструменти та архітектура вимагають багато користувачів / обладнання / грошей. Ви можете спробувати це в домашній лабораторії або вести блог, але це не має особливого сенсу.

Як правило, пам’ятайте, що ви хочете зробити це просто . Кожне додане проміжне програмне забезпечення - це ще одна важлива частина проміжного програмного забезпечення. Вдосконалення не досягається тоді, коли немає чого додати, але коли не залишається нічого для видалення.

Деякі поширені та цікаві розгортання

HAProxy (балансування) + nginx (програма php + кешування)

Веб-сервер - це nginx за допомогою php. Коли nginx вже є, він може також керувати кешуванням та переадресаціями.

HAProxy ---> nginx-php
A       ---> nginx-php
P       ---> nginx-php
r       ---> nginx-php
o       ---> nginx-php
x       ---> nginx-php
y       ---> nginx-php

HAProxy (балансування) + лак (кешування) + Tomcat (програма Java)

HAProxy може перенаправляти на Varnish на основі URI запиту (* .jpg * .css * .js).

HAProxy ---> tomcat
A       ---> tomcat
        ---> tomcat
P       ---> tomcat <----+
r       ---> tomcat <---+|
o                       ||
x       ---> varnish <--+|
y       ---> varnish <---+

HAProxy (балансування) + nginx (SSL для хоста та кешування) + веб-сервер (додаток)

Веб-сервери не розмовляють з SSL, навіть якщо ВСЕ ОБОВ'ЯЗКОВО говорити SSL ( особливо це посилання HAProxy-WebServer з приватною інформацією про користувачів, що проходить через EC2 ). Додавання локального nginx дозволяє піднести SSL до хоста. Після того, як nginx є, він також може зробити кешування та перезапис URL-адрес.

Примітка . Перенаправлення портів 443: 8080 відбувається, але це не є частиною функцій. Немає сенсу робити перенаправлення портів. Балансир навантаження може говорити безпосередньо на веб-сервері: 8080.

          (nginx + webserver on same host)
HAProxy ---> nginx:443 -> webserver:8080
A       ---> nginx:443 -> webserver:8080
P       ---> nginx:443 -> webserver:8080
r       ---> nginx:443 -> webserver:8080
o       ---> nginx:443 -> webserver:8080
x       ---> nginx:443 -> webserver:8080
y       ---> nginx:443 -> webserver:8080

Посереднє програмне забезпечення

HAProxy: балансир навантаження

Основні характеристики :

  • Балансування завантаження (TCP, HTTP, HTTPS)
  • Кілька алгоритмів (кругла робота, вихідний ip, заголовки)
  • Наполегливість сесії
  • Закінчення SSL

Подібні альтернативи : Nginx (багатоцільова веб-сервер налаштовуються в якості балансування навантаження)
Різні Альтернативи : Хмара (Amazon ELB, Google балансування навантаження), Hardware (F5, Fortinet, Citrix NetScaler), Інший і по всьому світу (DNS, нечіткий, CloudFlare)

Що робить HAProxy і коли ви його повинні використовувати?
Щоразу, коли вам потрібно балансувати навантаження. HAProxy - це шлях до рішення.

За винятком випадків, коли ви хочете дуже дешево АБО швидко і брудно АБО не маєте наявних навичок, тоді ви можете використовувати ELB: D

За винятком випадків, коли ви працюєте в банківській / урядовій / подібній службі та вимагаєте використовувати власний центр обробки даних із жорсткими вимогами (спеціальна інфраструктура, надійний відхід, 2 шари брандмауера, аудиторські матеріали, домовленості про сплату послуг за угоду про оплату x% за хвилину простою, все в одному) ви можете поставити 2 F5 поверх стійки, на якій розміщені 30 серверів додатків.

За винятком випадків, коли ви хочете пройти 100k HTTP (S) [та декількох сайтів], ви ОБОВ'ЯЗКОВО маєте кілька HAProxy із шаром [глобального] навантаження, що балансує перед ними (cloudflare, DNS, anycast). Теоретично глобальний балансир може спілкуватися прямо з веб-серверами, що дозволяють вирватися з HAProxy. Однак, як правило, ви повинні зберігати HAProxy (s) як публічну точку входу у свій центр обробки даних і налаштовувати розширені параметри, щоб справедливо балансувати між хостами та мінімізувати дисперсію.

Особиста думка : Невеликий, вміщений проект з відкритим кодом, повністю присвячений ОДИНІ ПРАВИЛЬНОМУ МЕТАЛІ. Серед найпростішої конфігурації (файл ONE), найкорисніше і найнадійніше програмне забезпечення з відкритим кодом, з яким я потрапив у своєму житті.

Nginx: Apache, який не смокче

Основні характеристики :

  • WebServer HTTP або HTTPS
  • Запускайте програми в CGI / PHP / деяких інших
  • Перенаправлення / перезапис URL-адрес
  • Управління доступом
  • Маніпулювання заголовками HTTP
  • Кешування
  • Зворотний проксі

Подібні альтернативи : Apache, Lighttpd, Tomcat, Gunicorn ...

Apache був фактичним веб-сервером, відомим також як гігантський кластерний набір з десятків модулів і тисяч рядків httpd.confповерх зламаної архітектури обробки запитів. nginx повторює все це, маючи менше модулів, (трохи) простішу конфігурацію та кращу архітектуру ядра.

Що робить nginx і коли ви його повинні використовувати?
Веб-сервер призначений для запуску програм. Коли ваша програма розробляється для запуску на nginx, у вас вже є nginx, і ви також можете використовувати всі його функції.

За винятком випадків, коли ваша програма не призначена для запуску на nginx, а nginx ніде не знайдено у вашому стеку (хтось у магазині Java?), То в nginx мало сенсу. Функції веб-серверів, ймовірно, існують у вашому поточному веб-сервері, а інші завдання краще вирішуються відповідним спеціальним інструментом (HAProxy / Varnish / CDN).

За винятком випадків, коли у вашого веб-сервера / програми не вистачає функцій, важко налаштувати та / або ви краще помріть роботу, ніж подивіться на неї (хтось із Gunicorn?), Тоді ви можете поставити nginx попереду (тобто локально на кожному вузлі) для виконання URL-адреси переписувати, надсилати 301 переадресацію, застосовувати контроль доступу, забезпечувати шифрування SSL та редагувати заголовки HTTP на ходу. [Це функції, які очікуються від веб-сервера]

Лак: сервер кешування

Основні характеристики :

  • Кешування
  • Розширений кешування
  • Дрібнозернистий кекінг
  • Кешування

Подібні альтернативи : nginx (багатоцільовий веб-сервер, який можна налаштувати як кешування-сервер)
Різні альтернативи : CDN (Akamai, Amazon CloudFront, CloudFlare), апаратне забезпечення (F5, Fortinet, Citrix Netscaler)

Що робить лак і коли ви його повинні використовувати?
Це робить кешування, лише кешування. Зазвичай це не варте зусиль і це марна трата часу. Спробуйте натомість CDN. Пам’ятайте, що кешування - це останнє, про що ви повинні піклуватися під час роботи веб-сайту.

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

За винятком випадків, коли ви змушені користуватися власним обладнанням у власному центрі обробки даних (CDN не є варіантом), і ваші веб-сервери страшні при доставці статичних файлів (додавання більшої кількості веб-серверів не допомагає), тоді Varnish є крайнім засобом.

За винятком випадків, коли у вас є веб-сайт із в основному статичним, але ще складним динамічно генерованим контентом (див. Наступні параграфи), тоді лак може заощадити багато процесорних потужностей на ваших веб-серверах.

Статичне кешування завищено у 2016 році

Кешування майже без конфігурації, без грошей та часу. Просто підпишіться на CloudFlare, або CloudFront, Akamai або MaxCDN. Написати цей рядок потрібно більше часу, ніж час, необхідний для налаштування кешування І пиво, яке я тримаю в руці, коштує дорожче, ніж медіанна передплата CloudFlare.

Усі ці сервіси працюють з вікна для статичного * .css * .js * .png та багато іншого. Насправді вони здебільшого шанують Cache-Controlдирективу в заголовку HTTP. Першим кроком кешування є налаштування веб-серверів для надсилання правильних кеш-директив. Не має значення, який CDN, який Varnish, який браузер знаходиться посередині.

Розгляд продуктивності

Лак був створений у той час, коли середні веб-сервери задихалися подавати зображення кота в блозі. На сьогоднішній день єдиний екземпляр середнього сучасного багатопотокового асинхронного веб-сервера, керований голосною мовою, може надійно доставити кошенят на всю країну. Надано людьми sendfile().

Я зробив кілька швидких тестувань продуктивності для останнього проекту, над яким працював. Один екземпляр tomcat може обслуговувати від 21 000 до 33 000 статичних файлів за секунду через HTTP (тестування файлів від 20B до 12kB з різним числом з'єднань HTTP / клієнта). Стійкий вихідний трафік перевищує 2,4 Гбіт / с. Виробництво матиме лише 1 Гбіт / с інтерфейси. Не вдається краще, ніж обладнання, немає сенсу навіть пробувати Varnish.

Кешування комплекс, зміна динамічного змісту

Сервери CDN і кешування зазвичай ігнорують URL-адреси з такими параметрами, як ?article=1843ігнорують будь-який запит із файлами cookie-сеансів або автентифікованими користувачами, і вони ігнорують більшість типів MIME, включаючи application/jsonз /api/article/1843/info. Існують варіанти конфігурації, але, як правило, не дрібнозернисті, швидше "все або нічого".

Лак може мати спеціальні складні правила (див. VCL) для визначення того, що підлягає керуванню, а що ні. Ці правила можуть кешувати певний вміст за допомогою URI, заголовків та поточного файлу cookie сеансу користувача та типу MIME та вмісту ВСІ РАЗОМ. Це може зекономити багато процесорних потужностей на веб-серверах для дуже специфічної моделі завантаження. Ось тоді лак зручний і ДУЖЕ.

Висновок

Мені знадобилося певний час, щоб зрозуміти всі ці фрагменти, коли їх використовувати і як вони поєднуються. Сподіваюся, що це може вам допомогти.

Це виявляється досить довгим (6 годин для написання. OMG!: O). Можливо, я повинен почати блог чи книгу про це. Факт забави: здається, що обмеження щодо тривалості відповіді не існує.


5
Довжина відповіді обмежена, але вам доведеться написати ще кілька книг, щоб досягти її.
Майкл Хемптон

2
Один момент, про який варто згадати, стосується кешування: його потужний шлях до підвищення продуктивності сайту, коли ви не маєте контролю над додатком; особливо, якщо у додатку є дійсно дурні заголовки кешу (кому-небудь додатки підприємства?). Ви, правда, повинні бути набагато більш обізнаними про автентифіковані ресурси.
Камерон Керр

@ user5994461 Я б хотів прочитати ваш блог. Дивовижна відповідь!
oxalorg

20

Це правда, що три інструменти мають спільні риси. Більшість налаштувань чудово налаштовані на будь-яку комбінацію 2 серед 3. Це залежить від того, яке їх основне призначення. Звичайно прийнято жертвувати кешуванням, якщо ви знаєте, що ваш сервер прикладних програм швидко працює (наприклад: nginx). Загальноприйнято жертвувати деякими функціями збалансування навантаження, якщо ви збираєтесь встановлювати десятки чи сотні серверів і не хвилюєтесь, як отримати максимальну користь від них, а також не вирішуйте проблеми. Як правило, жертвувати деякими функціями веб-сервера, якщо ви збираєтесь запускати розповсюджену програму з багатьма компонентами скрізь. І все-таки деякі люди будують цікаві ферми з усіма ними.

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

Іноді вам доведеться захищати від важких DDoS-атак, і гапрокси спереду будуть більше підходити, ніж інші.

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

Сподіваючись, що це допомагає!


1
+1 для HAProxy - автор відповідає на запитання про помилку сервера. Дякую.
Джоель К

Arenstar: Ви написали один із цих інструментів? Віллі Таррео - головний розробник HAProxy.
Джоель К

Дякую за це Віллі. Ви відповіли на моє запитання в Аренстарі вище.
Іоанн

2
Зауважте, що поточний код розробки для HAProxy тепер включає SSL.
Джоель К

14

Всі інші відповіді - до 2010 року, отже, додаємо оновлене порівняння.

Nginx

  • Повний веб-сервер, інші функції також можуть бути використані. Наприклад: стиснення HTTP
  • Підтримка SSL
  • Дуже невелика вага, оскільки Nginx був розроблений таким, щоб бути легким з самого початку.
  • Поруч із кешуванням режиму Varnish
  • Близький до ефективності балансування навантаження HAProxy

Лак

  • найкраще для складних сценаріїв кешування та включення в програму.
  • кращий статичний кеш-файл
  • Немає підтримки SSL
  • Пам'ять і процесор їсть

Гапрокси

  • найкращий балансир навантажень для найкращих функцій балансування навантаження, порівнянних з апаратними балансирами
  • SSL підтримується з 1.5.0
  • Простіше, будучи лише прокси-сервером tcp без використання http, що робить його швидшим і менш схильним до помилок.

Тому найкращим методом, здається, є реалізація всіх у відповідному порядку.

Однак, для загальних цілей, Nginx найкращий, оскільки ви отримуєте вище середньої продуктивності для всіх: кешування, зворотне наближення, балансування навантаження з дуже невеликими накладними витратами на використання ресурсів. І тоді у вас є SSL та повні функції веб-сервера.


6

У лаку підтримується балансування навантаження: http://www.varnish-cache.org/trac/wiki/LoadBalancing

Nginx має підтримку балансування навантаження: http://wiki.nginx.org/NginxHttpUpstreamModule

Я б просто налаштував це за допомогою лаку + оглушення. Якщо мені потрібна була nginx з якоїсь іншої причини, я б просто використовував nginx + лак. Можна nginx приймати SSL-з'єднання і проксі їх лакувати, а потім поговорити з nginx через http.

Деякі люди можуть кидати nginx (або Apache) у суміш, оскільки це дещо більш загальні засоби, ніж Varnish. Наприклад, якщо ви хочете трансформувати вміст (наприклад, за допомогою XDV, apache-фільтрів тощо) на проксі-шарі, вам знадобиться одна з них, тому що Varnish не може це зробити сам. Деякі люди можуть просто ознайомитись з конфігурацією цих інструментів, тому простіше використовувати Varnish як простий кеш і виконати балансування навантаження на іншому шарі, оскільки вони вже знайомі з Apache / nginx / haproxy як балансиром навантаження.


Праворуч - «резервний пул» мав на увазі вказати, що всі троє мають функції балансування навантаження. З мого початкового дослідження випливає, що HAProxy має найбільш налаштовані варіанти балансування навантаження.
Джоель К

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