From bb4d00b5dd4bdc1b5f0535b0323aad5b31e662a5 Mon Sep 17 00:00:00 2001 From: Vladimir Protsenko Date: Thu, 20 Oct 2022 23:11:33 +0400 Subject: [PATCH] Added nginx ha task. --- module2/00_bootloader/ref.md | 2 +- module2/03_nginx_ha/tasks.md | 288 ++++++++++++++++------------------- 2 files changed, 131 insertions(+), 159 deletions(-) diff --git a/module2/00_bootloader/ref.md b/module2/00_bootloader/ref.md index edf6e3a..992754d 100644 --- a/module2/00_bootloader/ref.md +++ b/module2/00_bootloader/ref.md @@ -1,6 +1,6 @@ # Источники -## Релевантные веб истоники +## Релевантные веб источники 1. https://0xax.gitbooks.io/linux-insides/content/Initialization/ 2. http://www.collados.cat/asix1/m01/tu1/m01tu01pr12.php diff --git a/module2/03_nginx_ha/tasks.md b/module2/03_nginx_ha/tasks.md index 691967f..6a424f2 100644 --- a/module2/03_nginx_ha/tasks.md +++ b/module2/03_nginx_ha/tasks.md @@ -1,197 +1,169 @@ # Задания -Источник: https://j3ffyang.medium.com/nginx-high-availability-and-load-balancing-with-keepalived-521d44798bff +## 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` виртуальные машины включены, отключена основная, отключена резервная. + -Nginx в настройке с высокой доступностью (HA) активной передачей (HA) на основе KeepAlive. +## 2. +Настройте nginx в high available конфигурации с проекта keepalived. Проект `keepalived` включает в себя три компонента: - демон-watchdog, контролирующий работоспособность двух других компонентов, -- реализация сетевого протокола VRRP (Virtual Router Redundancy Protocol), предназначенный для увеличения доступности маршрутизаторов, выполняющих роль шлюза по умолчанию.. +- реализация сетевого протокола VRRP (Virtual Router Redundancy Protocol), предназначенный для увеличения доступности маршрутизаторов, выполняющих роль шлюза по умолчанию, - процесс healthcheck для определения того, работает ли служба (например, веб-сервер или сервер базы данных). -VRRP гарантирует, что первичный учел в любое время. Резервный узел прослушивает оповещательные пакеты VRRP от первичного узла. Если он не получает оповещательный пакет в течение периода, более в три раза превышаемого заданного интервала, резервный узел берёт на себя функции первичного и назначает настроенный VIP себе. - -# 0. Подготовка Linux Virtual Server архитектуры -Подробно о LVS архитектуре вы можете прочитать в http://www.austintek.com/LVS/LVS-HOWTO/mini-HOWTO/LVS-mini-HOWTO.html. - -Сконфигурируем машины согласно следующей модели: -``` - ________ - | | - | client | (local or on internet) - |________| - | - Virtual IP - | ens18 - ____|_____ - | | (имеет 2 сетевых интерфейса: - | director | - ens18 в vmbr499 в сети 10.160.179.0/24, - |__________| - ens19 в vmbrX в сети 192.168.1.0/24) - | ens19 - -----------------+ - | | - RIP1 RIP2 - ____________ ____________ - | | | | - | realserver | | realserver | - |____________| |____________| -``` -Нам потребуется 4 машины: клиент (браузер или командная строка на ноутбуке), машина выполняющая роль балансировщика/роутера/дирижера, две машины с nginx серверами с идентичным содержимым сайта. - -В качестве машины-балансировщика используйте виртуальную машину studX или любую другую с IP адресом 10.160.179.10+X. Для серверов с nginx используйте IP из сети 192.168.1.0, которые можно вначале сконфигурировать в vlan15+X c организованным доступом в интернет через шлюз 192.168.1.1 и затем перенести в vlanX, где X ваш идентификатор. +VRRP гарантирует, что основной узел keepalived доступен в любое время. Резервный узел прослушивает оповещательные пакеты VRRP от первичного узла. Если он не получает оповещательный пакет в течение периода, более в три раза превышаемого заданного интервала, резервный узел берёт на себя функции первичного и назначает настроенный VIP себе. -## 1. -Установите nginx и keepalived на узлы: +Это задание можно выполнить в разных конфигурациях. Настроим для следующей: ``` -sudo apt install nginx keepalived + ________ + | | + | клиент | (ноутбук) + |________| + | + роутер 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 + +-------------------+ ``` -# 2. -Настройте nginx. - -``` -include /etc/nginx/conf.d/*.conf; - include /etc/nginx/sites-enabled/*; - merge_slashes off; - # set client body size to 2M # - client_max_body_size 2M; - upstream app.domain.com { - server 10.30.10.9:31399; - server 10.30.10.5:31399; - server 10.30.10.6:31399; - server 10.30.10.24:31399; - server 10.30.10.22:31399; - server 10.30.10.17:31399; - server 10.30.10.25:31399; - server 10.30.10.32:31399; - server 10.30.10.8:31399; - server 10.30.10.23:31399; - server 10.30.10.15:31399; - server 10.30.10.42:31399; - } - server { - ssl_certificate /home/ubuntu/certificates/cert.txt; - ssl_certificate_key /home/ubuntu/certificates/key.txt; - # include /etc/letsencrypt/options-ssl-nginx.conf; - # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - listen 443 ssl; - server_name app.domain.com; - location / { - # proxy_pass https://app.hostname.net:31712/; - proxy_pass https://app.domain.com/; - } - location /api/v1/wsock/websocket { - proxy_pass https://app.domain.com; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_read_timeout 86400; - } - } +Нам потребуется 3 машины: клиент (браузер или командная строка на ноутбуке), две машины с `nginx` c настроенным по-умолчанию сайтом. +## 2.1 +Установите nginx и keepalived на `nginx 3` и `nginx 4`: +``` +sudo apt install nginx keepalived ``` -# 3. -Настройте KeepAlived. +## 2.2 +Отредактируйте приветственную страницу по-умолчанию `/var/www/html/index.nginx-debian.html`, добавив номер сервера и проверьте, что сайт доступен по локальному адресу стандартному порту 80. -На первом сервере: +## 2.3 +Настройте keepalived на обоих узлах, используя следующую конфигурацию `/etc/keepalived/keepalived.conf` cогласно схеме приведённой выше. Пример конфигурации для узла `nginx 3`: ``` -! Configuration File for keepalived global_defs { -... + vrrp_version 3 } vrrp_script check_nginx { - script "/etc/keepalived/check_nginx.sh" - interval 2 - weight 50 + script "/etc/keepalived/check_nginx.sh" + interval 2 } -vrrp_instance VI_1 { - state MASTER - interface ens3 - virtual_router_id 50 - priority 110 - advert_int 1 - virtual_ipaddress { - 10.30.10.100 - } - track_script { - check_nginx - } +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 + } } ``` -На втором сервере: -``` -! Configuration File for keepalived -global_defs { -... -} -vrrp_script check_nginx { - script "/etc/keepalived/check_nginx.sh" - interval 2 - weight 50 -} -vrrp_instance VI_1 { - state BACKUP - interface ens3 - virtual_router_id 50 - priority 100 - advert_int 1 - virtual_ipaddress { - 10.30.10.100 - } - track_script { - check_nginx - } -} -``` +Cлужебная информация (vrrp-объявления от keepalived-лидера о том, что узел работоспособен) будет передаваться через сетевой интерфейс ens18 vlanX. Работоспособность узла отслеживается скриптом `chech_nginx`, указанным в блоке `track_script`. Скрипт настраивается в блоке `vrrp_script`, где указывается путь к исполняемому файлу и другие параметры. Keepalived пакет предоставляет документацию man для конфигурационного файла - `man keepalived`. -# 4. -Создайте скрипт для проверки работы nginx `/etc/keepalived/check_nginx.sh`. +Поменяйте параметр `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 -# Change mode of the script -sudo chmod +x /etc/keepalived/check_nginx.sh -``` - -# 5. - -Проверьте, что nginx отвечает, обратившись в виртуальному IP. -``` -$ curl http://10.30.10.100 # or curl http://1.2.3.6 - - - -Welcome to nginx! - - - -

Welcome to nginx web01!

-

If you see this page, the nginx web server is successfully installed and -working. Further configuration is required.

-

For online documentation and support please refer to -nginx.org.
-Commercial support is available at -nginx.com.

-

Thank you for using nginx.

- - - ``` +## 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/ - http://www.austintek.com/LVS/LVS-HOWTO/mini-HOWTO/LVS-mini-HOWTO.html \ No newline at end of file