Объясните балансировку нагрузки с помощью Nginx, как будто мне пять лет

Объясните балансировку нагрузки с помощью Nginx, как будто мне пять лет

Я нашел множество статей и руководств по самостоятельной настройке Nginx в качестве балансировщика нагрузки с использованием вышестоящего сервера:

upstream backend  {
  ip_hash;
  server 1.2.3.4;
  server 1.2.3.5;
  server 1.2.3.6;
}

server {
  location / {
    proxy_pass  http://backend;
  }
}

Но это все, что я могу найти относительно настройки этой архитектуры. В настоящее время у меня развернуто приложение rails на 3 внутренних VPS-серверах, и я использую Unicorn в качестве своего HTTP-сервера. Нужно ли мне устанавливать Ruby вместе с моим приложением rails и Unicorn на моем сервере балансировки нагрузки? Нужно ли мне устанавливать Nginx на каждом из вышестоящих серверов? Если да, то как их настроить? Если я внедрю в архитектуру что-то вроде Varnish, куда это попадет? Перед балансировщиком нагрузки или перед каждым из внутренних?

Вот наглядное представление того, как у меня все организовано:

                                       +---> backend1 <---+
                                       |                  |
[requests] <---> [Nginx load-balancer]-+---> backend2 <---+-[Database server]
                                       |                  |
                                       +---> backend3 <---+

решение1

Короткий ответ:

Nginxна самом деле у него есть только одна задача — принять входящий запрос и передать его на внутренний сервер.

Учитывая это, ваш(и) frontend сервер(ы) должны работать только nginx, а ваш(и) backend сервер(ы) должны работать только rails. Имеете ли вы смысл?

Теперь, если ваш бэкэнд и фронтэнд работают на одном сервере, то, конечно, его придется установить и там, но, судя по вашей схеме, я не думаю, что это так.

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

Nqinx -> Varnish -> Rails

решение2

При работе с Rails nginxможет использоваться для обслуживания нескольких ролей, чаще всего как балансировщик нагрузки HTTP или как фронтенд сервера приложений. Ваша настройка является обычной и будет работать, но может вызвать проблемы масштабирования по мере роста трафика до более высоких уровней.

Когда вы работаете с несколькими VPS-серверами, как вы описываете, один экземпляр nginx может выступать как в качестве основного балансировщика нагрузки HTTP для входящего трафика, так и в качестве интерфейса для разгрузки низкоуровневых обязанностей с серверов приложений Rails (обслуживание статических файлов, перезапись/перенаправление URL-адресов и т. д.).

nginx может обрабатывать много тысяч одновременных подключений без особых ресурсов, в то время как серверы приложений Unicorn Rails обычно могут обслуживать только несколько одновременных подключений. По мере увеличения масштаба вам понадобится больше экземпляров балансировщика нагрузки/фронтенда nginx (и метод балансировки нагрузки между ними, например DNS round-robin или другие механизмы).

Если вы используете Amazon AWS или другие более зрелые платформы хостинга, часто используется такой сервис, как Elastic Load Balancing (ELB) в качестве основного балансировщика веб-нагрузки. Каждый сервер приложений запускает nginx/Unicorn, используя nginx в качестве интерфейса для разгрузки обработки от каждого Unicorn. Это намного проще масштабировать из-за большого объема ELB перед каждым сервером.

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