Как настроить балансировку нагрузки с помощью Nginx

by moiseevrus

 

Преимущества балансировки нагрузки

 

Балансировка нагрузки — отличный способ масштабировать приложение и повысить его производительность и избыточность. Nginx, популярное программное обеспечение веб-сервера, можно настроить как простой, но мощный балансировщик нагрузки, чтобы повысить доступность и эффективность ресурсов вашего сервера.

Как работает Nginx? Nginx действует как единая точка входа в распределенное веб-приложение, работающее на нескольких отдельных серверах.

В этом руководстве описываются преимущества балансировки нагрузки. Узнайте, как настроить балансировку нагрузки с помощью nginx для ваших облачных серверов.

В качестве предварительного условия вам необходимо иметь по крайней мере два хоста с установленным и настроенным программным обеспечением веб-сервера, чтобы увидеть преимущества балансировщика нагрузки. Если у вас уже настроен один веб-хост, продублируйте его, создав собственный образ, и разверните его на новом сервере в панели управления UpCloud.

Установка nginx

Первое, что нужно сделать, это настроить новый хост, который будет служить балансировщиком нагрузки. Разверните новый экземпляр в панели управления UpCloud, если вы еще этого не сделали. В настоящее время пакеты nginx доступны для последних версий CentOS, Debian и Ubuntu. Так что выбирайте любой из них, который вы предпочитаете.

После того, как вы настроили сервер так, как вам нравится, установите последнюю стабильную версию nginx. Используйте один из следующих методов.

# Debian and Ubuntu
sudo apt-get update
# Then install the Nginx Open Source edition
sudo apt-get install nginx
# CentOS
# Install the extra packages repository
sudo yum install epel-release
# Update the repositories and install Nginx
sudo yum update
sudo yum install nginx
После установки измените каталог в основную папку конфигурации nginx.
cd /etc/nginx/
Теперь, в зависимости от вашей ОС, файлы конфигурации веб-сервера будут находиться в одном из двух мест.

Ubuntu и Debian следуют правилу хранения файлов виртуальных хостов в  /etc/nginx/sites- enabled/, которые включаются через символические ссылки на  /etc/nginx/sites-enabled/ . Вы можете использовать приведенную ниже команду, чтобы включить любые новые файлы виртуального хоста.

 

sudo ln -s /etc/nginx/sites-available/vhost /etc/nginx/sites-enabled/vhost

Пользователи CentOS могут найти файлы конфигурации своего хоста в /etc/nginx/conf.d/, в который загружается любой  файл виртуального хоста типа .conf .

Убедитесь, что вы нашли хотя бы конфигурацию по умолчанию, а затем перезапустите nginx.

sudo systemctl restart nginx

Проверьте, отвечает ли сервер на HTTP-запросы. Откройте общедоступный IP-адрес сервера балансировки нагрузки в веб-браузере. Когда вы видите приветственную страницу по умолчанию для nginx, установка прошла успешно.

Если у вас возникли проблемы с загрузкой страницы, убедитесь, что брандмауэр не блокирует ваше соединение. Например, в CentOS 7 правила брандмауэра по умолчанию не разрешают HTTP-трафик, включите его с помощью приведенных ниже команд.

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

Затем попробуйте перезагрузить браузер.

Настройка nginx как балансировщика нагрузки

Когда nginx будет установлен и протестирован, начните настраивать его для балансировки нагрузки. По сути, все, что вам нужно сделать, это настроить nginx с инструкциями, какие типы соединений прослушивать и куда их перенаправлять. Создайте новый файл конфигурации с помощью любого текстового редактора, который вы предпочитаете. Например, с нано :

sudo nano /etc/nginx/conf.d/load-balancer.conf

В load-balancer.conf вам нужно определить следующие два сегмента, upstream и server , см. примеры ниже.

# Define which servers to include in the load balancing scheme. 
# It's best to use the servers' private IPs for better performance and security.
# You can find the private IPs at your

UpCloud control panel

 Network section.
http {
   upstream backend {
      server 10.1.0.101; 
      server 10.1.0.102;
      server 10.1.0.103;
   }

   # This server accepts all traffic to port 80 and passes it to the upstream. 
   # Notice that the upstream name and the proxy_pass need to match.

   server {
      listen 80; 

      location / {
          proxy_pass http://backend;
      }
   }
}
Затем сохраните файл и выйдите из редактора.

Затем отключите конфигурацию сервера по умолчанию, которую вы ранее тестировали, после установки. Опять же, в зависимости от вашей ОС эта часть немного отличается.

В системах Debian и Ubuntu вам необходимо удалить символическую ссылку по умолчанию из папки с поддержкой сайтов .

sudo rm /etc/nginx/sites-enabled/default

Хосты CentOS не используют одну и ту же ссылку. Вместо этого просто переименуйте файл default.conf в каталоге conf.d/ во что-то, что не заканчивается на .conf , например:

sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled

Затем используйте следующее, чтобы перезапустить nginx.

sudo systemctl restart nginx

Убедитесь, что nginx успешно запускается. Если перезагрузка не удалась, взгляните на  только что созданный файл /etc/nginx/conf.d/load-balancer.conf , чтобы убедиться, что в нем нет опечаток или отсутствующих точек с запятой.

Когда вы вводите общедоступный IP-адрес балансировщика нагрузки в веб-браузере, вы должны перейти на один из внутренних серверов.

Методы балансировки нагрузки

Балансировка нагрузки с помощью nginx по умолчанию использует циклический алгоритм, если не определен другой метод, как в первом примере выше. При круговой схеме каждый сервер выбирается по очереди в соответствии с порядком, заданным вами в файле load-balancer.conf  . Это уравновешивает количество запросов для коротких операций.

Балансировка нагрузки на основе наименьшего количества подключений — еще один простой метод. Как следует из названия, этот метод направляет запросы на сервер с наименее активными соединениями в данный момент. Он работает более справедливо, чем циклический алгоритм, с приложениями, в которых выполнение запросов иногда может занимать больше времени.

Чтобы включить метод балансировки с наименьшим количеством соединений, добавьте параметр last_conn в свой восходящий  раздел, как показано в примере ниже.

upstream backend {
   least_conn;
   server 10.1.0.101; 
   server 10.1.0.102;
   server 10.1.0.103;
}

Схемы балансировки циклического перебора и наименьшего количества соединений справедливы и имеют свое применение. Однако они не могут обеспечить постоянство сеанса. Если ваше веб-приложение требует, чтобы пользователи впоследствии направлялись на тот же внутренний сервер, что и во время их предыдущего подключения, вместо этого используйте метод хеширования IP. Хэширование IP-адресов использует IP-адрес посетителей в качестве ключа для определения того, какой хост следует выбрать для обслуживания запроса. Это позволяет каждый раз направлять посетителей на один и тот же сервер при условии, что сервер доступен и IP-адрес посетителя не изменился.

Чтобы использовать этот метод, добавьте параметр ip_hash в восходящий  сегмент, как в примере ниже.

upstream backend {
   ip_hash;
   server 10.1.0.101; 
   server 10.1.0.102;
   server 10.1.0.103;
}

В конфигурации сервера, где доступные ресурсы между разными хостами не равны, может быть желательно отдавать предпочтение одним серверам по сравнению с другими. Определение весов серверов позволяет вам дополнительно настроить балансировку нагрузки с помощью nginx. Чаще всего выбирается сервер с наибольшим весом в балансировщике нагрузки.

upstream backend {
   server 10.1.0.101 weight=4; 
   server 10.1.0.102 weight=2;
   server 10.1.0.103;
}

Например, в показанной выше конфигурации первый сервер выбирается в два раза чаще, чем второй, который снова получает в два раза больше запросов по сравнению с третьим.

Балансировка нагрузки с включенным HTTPS

Включите HTTPS для своего сайта, это отличный способ защитить ваших посетителей и их данные. Если вы еще не реализовали шифрование на своих веб-хостах, мы настоятельно рекомендуем вам ознакомиться с нашим руководством по установке Let’s Encrypt на nginx .

Использовать шифрование с балансировщиком нагрузки проще, чем вы думаете. Все, что вам нужно сделать, это добавить еще один раздел сервера в файл конфигурации балансировщика нагрузки, который прослушивает трафик HTTPS через порт 443 с помощью SSL. Затем настройте proxy_pass для восходящего сегмента, как с HTTP в предыдущем примере выше.

Снова откройте файл конфигурации для редактирования.

sudo nano /etc/nginx/conf.d/load-balancer.conf

Затем добавьте следующий сегмент сервера в конец файла.

server {
   listen 443 ssl;
   server_name domain_name;
   ssl_certificate /etc/letsencrypt/live/domain_name/cert.pem;
   ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

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

Затем сохраните файл, выйдите из редактора и снова перезапустите nginx.

sudo systemctl restart nginx

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

  • Поскольку только ваши серверы UpCloud имеют доступ к вашей частной сети, это позволяет вам прерывать SSL на балансировщике нагрузки и, таким образом, передавать только прямые HTTP-соединения.
  • Это также значительно упрощает управление сертификатами. Вы можете получать и обновлять сертификаты с одного хоста.

При включенном HTTPS у вас также есть возможность принудительно использовать шифрование для всех подключений к вашему балансировщику нагрузки. Просто обновите свой серверный сегмент, прослушивающий порт 80, указав имя сервера и перенаправление на ваш HTTPS-порт. Затем удалите или закомментируйте часть местоположения , так как она больше не нужна. См. пример ниже.

server {
   listen 80;
   server_name domain_name;
   return 301 https://$server_name$request_uri;

   #location / {
   #   proxy_pass http://backend;
   #}
}
Сохраните файл еще раз после внесения изменений. Затем перезапустите nginx.
sudo systemctl restart nginx

Теперь все соединения с вашим балансировщиком нагрузки будут обслуживаться через зашифрованное соединение HTTPS. Запросы к незашифрованному HTTP также будут перенаправлены на использование HTTPS. Это обеспечивает плавный переход к шифрованию. От посетителей ничего не требуется.

Проверки здоровья

Чтобы узнать, какие серверы доступны, реализации обратного прокси-сервера nginx включают пассивные проверки работоспособности сервера. Если сервер не отвечает на запрос или отвечает с ошибкой, nginx заметит, что сервер неисправен. Он попытается какое-то время избегать переадресации подключений к этому серверу.

Количество последовательных неудачных попыток подключения за определенный период времени можно определить в файле конфигурации балансировщика нагрузки. Установите параметр max_fails в строки сервера. По умолчанию, когда нет max_fails не указан, этому значению присваивается значение 1. При необходимости установка max_fails на 0 отключит проверки работоспособности на этом сервере.

Если для max_fails установлено значение больше 1, последующие сбои должны произойти в течение определенного периода времени, чтобы сбои учитывались. Этот временной интервал определяется параметром fail_timeout , который также определяет, как долго сервер считается неисправным. По умолчанию fail_timeout установлено значение 10 секунд.

После того, как сервер помечен как неисправный и время, установленное fail_timeout , nginx начнет изящно проверять сервер с клиентскими запросами. Если зонды возвращаются успешно, сервер снова помечается как работающий и включается в балансировку нагрузки в обычном режиме.

upstream backend {
   server 10.1.0.101 weight=5;
   server 10.1.0.102 max_fails=3 fail_timeout=30s;
   server 10.1.0.103;
}

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

Выводы о преимуществах балансировки нагрузки

Если вы хотите улучшить производительность и доступность вашего веб-приложения, вам определенно стоит подумать о балансировщике нагрузки. Nginx является мощным, но относительно простым в настройке веб-сервером с балансировкой нагрузки. В сочетании с простым решением для шифрования, таким как клиент Let’s Encrypt, это обеспечивает отличный внешний интерфейс для вашей веб-фермы. Проверить с документацией по апстриму на nginx.org, чтобы узнать больше.

Когда вы используете несколько хостов, защищает ваш веб-сервис с помощью избыточности, сам балансировщик нагрузки все еще может оставить единую точку отказа. Вы можете дополнительно улучшить высокую доступность, настроив плавающий IP-адрес между несколькими балансировщиками нагрузки. Узнайте больше в нашей статье о  плавающих IP-адресах на UpCloud .

 

 



			
            
			        

You may also like

Leave a Comment