Балансировка нагрузки между серверами IIS с помощью Nginx

Балансировка нагрузки между серверами IIS с помощью Nginx

Официальным решением MSFT для организации балансировки нагрузки между веб-серверами Windows в ферме IIS является расширение Application Request Routing (ARR). В этой статье мы рассмотрим схему, при которой, в качестве балансировщика нагрузки между веб серверами Internet Information Services (IIS версии 8.0 и выше), будет использоваться хорошо зарекомендовавший себя HTTP/реверс прокси Nginx.

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

Совет. Основной недостаток Application Request Routing (ARR) по сравнению с Nginx – он не позволяет отслеживать HTTP запросы для нескольких сайтов и требует дополнительной лицензии на Windows.

В нашем примере, веб ферма состоит из двух IIS серверов на базе Windows Server 2012. В качестве фронд-энд сервера будет выступать сервер Linux с установленным Nginx. В случае необходимости эту конфигурацию можно с лёгкостью масштабировать, добавив необходимое количество серверов IIS. Nginx способен скрывать за собой множество бэкенд веб серверов, распределяя запросы между ними с помощью различных правил. Добавление или удаление любого сервера IIS из такой фермы не сказывается на доступности сайта с точки зрения пользователей.

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236dacc078

Настройка веб серверов в ферме IIS

В первую очередь, на обоих веб-северах Windows нужно установить роль IIS. Задача выполняется с помощью консоли Server Manager или при помощи PowerShell:

import-module servermanager
Install-WindowsFeature -Name Web-Server, Web-Mgmt-Tools


d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236db0d26d

На отдельном сервере файловом сервере Windows создадим две сетевые папки:

  • В первой будет хранится общая конфигурация IIS — file-srv1iis_config
  • Во-второй – файлы сайтов — file-srv1iis_site

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236db96325

В разрешениях обоих общих папок добавьте группу Everyone с правами Full Control.

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236dbddaf0

Затем на обоих сайтах нужно установить расширение ARR Helper, которое позволит использовать в заголовках IIS правильные адреса посетителей (иначе там всегда будет указан ip адрес сервера с Nginx). Данное расширение входит в состав IIS Application Request Routing package (ARR) 3.0 и после установки последнего на любом сервере, его дистрибутив requestrouterhelper_x64.msi может быть вручную скопирован из каталога %ProgramFiles%IISApplication Request Routing.

После установки IIS, скопируйте содержимое каталога c:inetpubwwwroot в сетевую папку file-srv1iis_site. После этого в консоли управления IIS, выберите сайт DefaultWebSite и откройте его настройки (Basic Settings), указав в поле Physical path путь к сетевой папке.

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236dc44a3a

Настройте сайт в соотвествии со своими требованиями, проверьте, что он корректно открывается и работает. Затем, откройте раздел Shared Configuration и нажмите на кнопку Export Configuration.

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236dc73081

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

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236dcc96d2

Включите опцию Enable shared configuration, и укажите путь к сетевой шаре с конфигурацией IIS. Нажмите Apply и укажите пароль.

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236dd14273

Затем укажите учетную запись, из-под которой должен быть запущен пул IIS. Причем эта учетная запись также должна иметь RW права на доступ к ранее описанным сетевым каталогам (как правило используется специальная доменная служебная запись или групповая сервисная запись gMSA). Для этого откройте секцию IIS Authentication и измените параметры анонимной аутентификации (Anonymous Authentication), указав имя пользователя.

d0b1d0b0d0bbd0b0d0bdd181d0b8d180d0bed0b2d0bad0b0 d0bdd0b0d0b3d180d183d0b7d0bad0b8 d0bcd0b5d0b6d0b4d183 d181d0b5d180d0b2d0b5d180d0b0 65d236dd9729e

Попробуйте открыть сайт. Если все работает, перейдите к следующему этапу.

Теперь нужно аналогично настроить второй сервер. Установите ARRhelper, подключите общую конфигурацию IIS из сетевой папки, укажите учетную запись для запуска пула.

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

После того, как конфигурация веб серверов IIS закончена, можно перейти к настройке Nginx.

Установите nginx командой:
sudo apt-get install nginx

После установки отредактируйте конфигурационный файл /etc/nginx/sites-enabled/default

В нашем случае получился такой конфиг:

#список веб серверов IIS, между которыми нужно распределять нагрузку
upstream web_servers {
server 192.168.1.13;
server 192.168.1.14;
}
#порт
server {
listen 80;
location / {
proxy_pass http://winitpro.ru;
# настройка заголовков
proxy_set_header X-proxy 192.168.1.12;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
# Ошибки, при которых nginx должен переключатся на следующий сервер
proxy_next_upstream     error timeout invalid_header http_500 http_404;
proxy_set_header X-Client-IP $remote_addr;
}
}

Сохраните файл и перезапустите nginx:

sudo /etc/init.d/nginx restart


Осталось настроить DNS записи сайтов, так чтобы они указывали на ip адрес сервера nginx и убедиться, что запросы распределяются между веб серверами по алгоритму round robin.

Qiziqarli malumotlar
Балансировка нагрузки между серверами IIS с помощью Nginx