Балансування навантаження між серверами 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-srv1 \ iis_config
  • По-друге - файли сайтів - \\ file-srv1 \ iis_site

У дозволах обох загальних папок додайте групу Everyone з правами Full Control.

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

Після установки IIS, скопіювати вміст каталогу c: \ inetpub \ wwwroot в мережеву папку \\ file-srv1 \ iis_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.