Я нашел множество статей и руководств по самостоятельной настройке 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 перед каждым сервером.