Балансировка нагрузки для клиентских сервисов Windows Azure Pack с помощью Nginx
В этой статье приведено готовое решение по балансировке нагрузки для клиентских сервисов WAP с помощью Nginx. При всей моей любви к lvs (ipvs), в данном случае его использование совсем неоправдано. Простота конфигурирования, удобство поиска ошибок, высокая надежность, шикарная документация, возможность балансировки нагрузки - все это есть в Nginx. К тому же было очень интересно попробовать его в качестве балансировщика.В нашем случае я принял решение использовать только один сервер Nginx. Развертывание второго неоправдано. Опыт показывает, что аптайм запросто может перевалить за год, и повлиять на работоспособность Nginx может только совсем неординарная ситуация. Даже при самом плохом сценарии простой портала WAP из-за падения балансировщика не привысит 10-15 минут. Это не критично, так как на работоспособность виртуальных машин клиентов сбой не повлияет. Просто на некоторое время они утратят возможность управления своей подпиской.
Для развертывания балансировщика нагрузки мы будем использовать виртуальную машину с ОС Linux Centos 7, 1 vCPU, 1 GB RAM. На ней необходимо сконфигурировать два интерфейса - внешний и внутренний. В качестве DNS серверов в нашем примере используются контроллеры домена из инфраструктуры AD (прописываются в /etc/resolv.conf).
1. Добавляем правила firewalld:
#firewall-cmd --zone=public --add-port=443/tcp --permanent
#firewall-cmd --zone=public --add-port=80/tcp --permanent
Я всегда рекомендую менять дефолтный порт для SSH, поэтому надо добавить и его. Например 2233:
#firewall-cmd --zone=public --add-port=2233/tcp --permanent
Применяем и сохраняем правила:
#firewall-cmd --reload
#vi /etc/selinux/config
SELINUX=disabled
Чтобы выйти из редактора vi с сохранением изменений, надо нажать последовательно ":wq".
3. Теперь необходимо установить все обновления для ОС и выполнить перезагрузку:
#yum -y update; reboot
4. Добавим репозиторий Nginx:
#vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
5. Установим nginx:
#yum -y install nginx
6. Добавим наш сертификат для портала WAP. Для этого создадим каталок и добавим в него любым удобным способом открытый и закрытый ключи.
#mkdir /etc/nginx/ssl/
/etc/nginx/ssl/linby.crt
/etc/nginx/ssl/linby.key
6. Теперь пришло время создать наш первый конфигурационный файл. Начнем с самого важного - портал WAP и портал WAP-Auth:
#vi /etc/nginx/conf.d/wap.conf
upstream waptenant {
ip_hash; # балансировка нагрузки по IP клиента
#сервера waptenant
server waptenant01.linby.local:443 max_fails=3 fail_timeout=30s;
server waptenant02.linby.local:443 max_fails=3 fail_timeout=30s;
# Если будет 3 неудачных попытки подключения за 30 секунд - nginx приостановит отправку запросов к серверу (выбросит из балансировки)
}
server {
listen 180.60.70.80:443; # наш внешний IP
server_name wap.lin.by wap-auth.lin.by; #внешние URL
ssl on;
ssl_certificate ssl/linby.crt; # Публичный ключ
ssl_certificate_key ssl/linby.key; # Приватный ключ
ssl_session_timeout 5m;
#разрешаем только безопасные протоколы и алгоритмы шифрования
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
location / {
proxy_pass https://waptenant/;
proxy_set_header Host $http_host; #передаем в заголовке внешний URL
proxy_set_header HTTPS on; #передаем заголовки HTTPS
}
access_log /var/log/nginx/wap.access.log main; #файл лога запросов
}
#service nginx restart
Теперь можно проверять, проксируются ли запросы. Если что-то не работает, проверяем логи:
/var/log/nginx/error.log
/var/log/nginx/wap.access.log
6. Теперь надо добавить редирект всех HTTP запросов на HTTPS. Тут все просто:
#vi /etc/nginx/conf.d/http-redirect.conf
server {
listen 80 default_server;
server_name wap.lin.by;
return 301 https://$server_name$request_uri;
}
#service nginx restart
На данном этапе основной функционал пользовательского портала WAP должен работать полностью. Но ведь это еще не все. Например, у нас активно используется публичный API. Работает он дефолтно на порту 30006. Добавим конфиг и для него. Он мало чем отличается от wap.conf, поэтому опишем только дельту:
#vi /etc/nginx/conf.d/wap-api.conf
upstream waptenant {
ip_hash;
server waptenant01.linby.local:30006 max_fails=3 fail_timeout=30s;
server waptenant02.linby.local:30006 max_fails=3 fail_timeout=30s;
}
server {
listen 180.60.70.80:30006;
server_name wap-api.lin.by;
...
access_log /var/log/nginx/wap-api.access.log main;
}
ip_hash;
server waptenant01.linby.local:30006 max_fails=3 fail_timeout=30s;
server waptenant02.linby.local:30006 max_fails=3 fail_timeout=30s;
}
server {
listen 180.60.70.80:30006;
server_name wap-api.lin.by;
...
access_log /var/log/nginx/wap-api.access.log main;
}
Так же надо добавить новое правило для firewall:
#firewall-cmd --zone=public --add-port=30006/tcp --permanent
Перезапускаем Nginx и проверяем результат.
Если понадобится выполнить публикацию других сервисов - подойдут примеры конфигурационных файлов выше.
Для вывода одного из серверов waptenant на обслуживание, достаточно добавить в upstream опцию "down" и выполнить reload Nginx:
upstream waptenant {
...
server waptenant02.linby.local:30006 max_fails=3 fail_timeout=30s down;
...
}
#service nginx reload
Параметры ротации логов будут применены существующие для Nginx. Посмотреть и изменить их можно в файле /etc/logrotate.d/nginx.
Комментариев нет:
Отправить комментарий