Назад | Перейти на главную страницу

Объясните балансировку нагрузки с помощью 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 <---+

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

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

Учитывая это, ваш интерфейсный сервер (-ы) нужно только запустить nginx и вашему внутреннему серверу (-ам) нужно только запустить rails. Есть смысл?

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

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

Nqinx -> Varnish -> Rails

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

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

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

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