Балансировка нагрузки между серверами 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 из такой фермы не сказывается на доступности сайта с точки зрения пользователей.
Настройка веб серверов в ферме IIS
В первую очередь, на обоих веб-северах Windows нужно установить роль IIS. Задача выполняется с помощью консоли Server Manager или при помощи PowerShell:
import-module servermanager
Install-WindowsFeature -Name Web-Server, Web-Mgmt-Tools
На отдельном сервере файловом сервере Windows создадим две сетевые папки:
- В первой будет хранится общая конфигурация IIS — file-srv1iis_config
- Во-второй – файлы сайтов — file-srv1iis_site
В разрешениях обоих общих папок добавьте группу Everyone с правами Full Control.
Затем на обоих сайтах нужно установить расширение 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 путь к сетевой папке.
Настройте сайт в соотвествии со своими требованиями, проверьте, что он корректно открывается и работает. Затем, откройте раздел Shared Configuration и нажмите на кнопку Export Configuration.
Укажите полный путь к сетевой папке, в которой будет храниться конфигурация IIS, и укажите пароль для ключей шифрования.
Включите опцию Enable shared configuration, и укажите путь к сетевой шаре с конфигурацией IIS. Нажмите Apply и укажите пароль.
Затем укажите учетную запись, из-под которой должен быть запущен пул IIS. Причем эта учетная запись также должна иметь RW права на доступ к ранее описанным сетевым каталогам (как правило используется специальная доменная служебная запись или групповая сервисная запись gMSA). Для этого откройте секцию IIS Authentication и измените параметры анонимной аутентификации (Anonymous Authentication), указав имя пользователя.
Попробуйте открыть сайт. Если все работает, перейдите к следующему этапу.
Теперь нужно аналогично настроить второй сервер. Установите 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