# Задания ## 1. Настройте nginx в high available конфигурации с помощью модуля nginx - `ngx_http_upstream_module`. Сконфигурируйте nginx на трёх виртуальных машинах. Для тестировании используйте машину отличную от этих трёх. Пример конфигурации 1: ``` ________ | | | клиент | (ноутбук) |________| | роутер public IP 193.32.63.185:[22,80,443] -> private IP 10.160.179.25:[22,80,443] | | ens18 в vlan499 с доступом в интернет с IP 10.160.179.25/24 _______|_______ | | | proxy | |_______________| | ens19 в vlan X с IP 192.168.X.1/24 | +---------+--------+ | 192.168.X.2/24 | 192.168.X.3/24 ___________ ___________ | | | | | nginx 1 | | nginx 2 | |___________| |___________| ``` Пример конфигурации 2: ``` ________ | | | клиент | (ноутбук) |________| | роутер 193.32.63.185:[22,80,443] -> 10.160.179.25:[22,80,443] | +--------------------+---------------------+ | 10.160.179.25/24 | 10.160.179.180/24 | 10.160.179.181/24 _______|_______ ___________ ___________ | | | | | | | proxy | | nginx 1 | | nginx 2 | |_______________| |___________| |___________| ``` Для конфигурации 2 используйте IP из блоков по 10 адресов, согласно следующему списку соответствий `X - первый IP блока`: ``` 1 - 10.160.179.40/24 | 6 - 10.160.179.90/24 | 11 - 10.160.179.140/24 2 - 10.160.179.50/24 | 7 - 10.160.179.100/24 | 12 - 10.160.179.150/24 3 - 10.160.179.60/24 | 8 - 10.160.179.110/24 | 13 - 10.160.179.160/24 4 - 10.160.179.70/24 | 9 - 10.160.179.120/24 | 14 - 10.160.179.170/24 5 - 10.160.179.80/24 | 10 - 10.160.179.130/24 | 15 - 10.160.179.180/24 ``` На машинах `nginx 1` и `nginx 2` установите nginx, отредактируйте приветственную страницу по-умолчанию `/var/www/html/index.nginx-debian.html`, добавив номер сервера и проверьте, что сайт доступен по локальному адресу стандартному порту 80. Отредактируйте конфигурацию по-умолчанию `/etc/nginx/sites-enabled/default`. Используйте блок `upstream` на машине `proxy` для настройки прокси-сервера с функцией балансировки нагрузки и резервирования. Укажите в блоке ip адреса двух серверов `nginx 1` и `nginx 2` и укажите для одного из них параметр `backup` (этот узел будет резервным). Пример конфигурации 2 для stud15: ``` upstream backend { server 10.160.179.180; server 10.160.179.181 backup; } server { location / { proxy_pass http://backend; } } ``` Проверьте работоспособность сайта по адресу прокси сервера для случаев когда `nginx 1` и `nginx 2` виртуальные машины включены, отключена основная, отключена резервная. ## 2. Настройте nginx в high available конфигурации с проекта keepalived. Проект `keepalived` включает в себя три компонента: - демон-watchdog, контролирующий работоспособность двух других компонентов, - реализация сетевого протокола VRRP (Virtual Router Redundancy Protocol), предназначенный для увеличения доступности маршрутизаторов, выполняющих роль шлюза по умолчанию, - процесс healthcheck для определения того, работает ли служба (например, веб-сервер или сервер базы данных). VRRP гарантирует, что основной узел keepalived доступен в любое время. Резервный узел прослушивает оповещательные пакеты VRRP от первичного узла. Если он не получает оповещательный пакет в течение периода, более в три раза превышаемого заданного интервала, резервный узел берёт на себя функции первичного и назначает настроенный VIP себе. Это задание можно выполнить в разных конфигурациях. Настроим для следующей: ``` ________ | | | клиент | (ноутбук) |________| | роутер public IP 193.32.63.185:[22,80,443] -> private IP 10.160.179.25:[22,80,443] | +---------+--------+ | | 10.160.179.25/24 в роли virtual IP | ens19 | ens19 ___________ ___________ | | | | | nginx 3 | | nginx 4 | |___________| |___________| | ens18 в vlan X | ens18 в vlan X | 192.168.X.1/24 | 192.168.X.2/24 +-------------------+ ``` Нам потребуется 3 машины: клиент (браузер или командная строка на ноутбуке), две машины с `nginx` c настроенным по-умолчанию сайтом. ## 2.1 Установите nginx и keepalived на `nginx 3` и `nginx 4`: ``` sudo apt install nginx keepalived ``` ## 2.2 Отредактируйте приветственную страницу по-умолчанию `/var/www/html/index.nginx-debian.html`, добавив номер сервера и проверьте, что сайт доступен по локальному адресу стандартному порту 80. ## 2.3 Настройте keepalived на обоих узлах, используя следующую конфигурацию `/etc/keepalived/keepalived.conf` согласно схеме приведённой выше. Пример конфигурации для узла `nginx 3`: ``` global_defs { vrrp_version 3 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 } vrrp_instance VI1 { state MASTER interface ens19 virtual_router_id 1 priority 110 advert_int 1 mcast_src_ip 192.168.X.1 virtual_ipaddress { 10.160.179.25/24 } virtual_routes { default via 10.160.179.1 } track_script { chech_nginx } } ``` Служебная информация (vrrp-объявления от keepalived-лидера о том, что узел работоспособен) будет передаваться через сетевой интерфейс ens18 vlanX. Работоспособность узла отслеживается скриптом `chech_nginx`, указанным в блоке `track_script`. Скрипт настраивается в блоке `vrrp_script`, где указывается путь к исполняемому файлу и другие параметры. Keepalived пакет предоставляет документацию man для конфигурационного файла - `man keepalived`. Поменяйте параметр `state` на `BACKUP` и уменьшите параметр `priority` для резервного узла, поменяйте адрес `mcast_src_ip`, используемый для передачи служебной информации. На обеих машинах создайте скрипт для проверки работы nginx `/etc/keepalived/check_nginx.sh` и отключения `keepalived` процесса, в случае неработоспособности nginx сервиса (не найден pid процесса nginx). ``` #!/bin/sh if [ -z "`/bin/pidof nginx`" ]; then systemctl stop keepalived.service exit 1 fi ``` ## 2.4 Проверьте работоспособность сайта по адресу `http://IP` (IP - virtual IP или соответствующему ему белому IP по адресу) для случаев когда `nginx 3` и `nginx 4` виртуальные машины включены, отключена основная, отключена резервная. Выведите информацию о назначенных IP для сетевых интерфейсов для каждого случая. # 3. Дополнительное задание. Модифицируйте настройки на машинах первого и второго задания для обеспечения балансировки нагрузки. # Релевантные источники - https://nginx.org/ru/docs/http/ngx_http_upstream_module.html - https://ru.wikipedia.org/wiki/VRRP - https://keepalived.readthedocs.io/en/latest/ - https://datatracker.ietf.org/doc/html/rfc2338 - http://www.austintek.com/LVS/LVS-HOWTO/mini-HOWTO/LVS-mini-HOWTO.html