пятница, 27 января 2017 г.

Балансировка нагрузки для клиентских сервисов 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

2. Отключаем SELinux. Для этого правим файл настроек:

#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; #файл лога запросов

    }

Далее выполним рестарт Nginx:

#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;
    }

Так же надо добавить новое правило для 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.


Комментариев нет:

Отправить комментарий