|
|
|
@ -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 на трёх виртуальных машинах. Для тестировани используйте машину отличную от этих трёх.
|
|
|
|
|
|
|
|
|
|
Nginx в настройке с высокой доступностью (HA) активной передачей (HA) на основе KeepAlive.
|
|
|
|
|
Пример конфигурации 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), предназначенный для увеличения доступности маршрутизаторов, выполняющих роль шлюза по умолчанию..
|
|
|
|
|
- реализация сетевого протокола 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.
|
|
|
|
|
VRRP гарантирует, что основной узел keepalived доступен в любое время. Резервный узел прослушивает оповещательные пакеты VRRP от первичного узла. Если он не получает оповещательный пакет в течение периода, более в три раза превышаемого заданного интервала, резервный узел берёт на себя функции первичного и назначает настроенный VIP себе.
|
|
|
|
|
|
|
|
|
|
Сконфигурируем машины согласно следующей модели:
|
|
|
|
|
Это задание можно выполнить в разных конфигурациях. Настроим для следующей:
|
|
|
|
|
```
|
|
|
|
|
________
|
|
|
|
|
| |
|
|
|
|
|
| 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
|
|
|
|
|
____________ ____________
|
|
|
|
|
роутер 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
|
|
|
|
|
___________ ___________
|
|
|
|
|
| | | |
|
|
|
|
|
| realserver | | realserver |
|
|
|
|
|
|____________| |____________|
|
|
|
|
|
| nginx 3 | | nginx 4 |
|
|
|
|
|
|___________| |___________|
|
|
|
|
|
| ens18 в vlan X | ens18 в vlan X
|
|
|
|
|
| 192.168.X.1/24 | 192.168.X.2/24
|
|
|
|
|
+-------------------+
|
|
|
|
|
```
|
|
|
|
|
Нам потребуется 4 машины: клиент (браузер или командная строка на ноутбуке), машина выполняющая роль балансировщика/роутера/дирижера, две машины с nginx серверами с идентичным содержимым сайта.
|
|
|
|
|
|
|
|
|
|
В качестве машины-балансировщика используйте виртуальную машину studX или любую другую с IP адресом 10.160.179.10+X. Для серверов с nginx используйте IP из сети 192.168.1.0, которые можно вначале сконфигурировать в vlan15+X c организованным доступом в интернет через шлюз 192.168.1.1 и затем перенести в vlanX, где X ваш идентификатор.
|
|
|
|
|
Нам потребуется 3 машины: клиент (браузер или командная строка на ноутбуке), две машины с `nginx` c настроенным по-умолчанию сайтом.
|
|
|
|
|
|
|
|
|
|
## 1.
|
|
|
|
|
Установите nginx и keepalived на узлы:
|
|
|
|
|
## 2.1
|
|
|
|
|
Установите nginx и keepalived на `nginx 3` и `nginx 4`:
|
|
|
|
|
```
|
|
|
|
|
sudo apt install nginx keepalived
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# 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.
|
|
|
|
|
Настройте 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
|
|
|
|
|
}
|
|
|
|
|
vrrp_instance VI_1 {
|
|
|
|
|
vrrp_instance VI1 {
|
|
|
|
|
state MASTER
|
|
|
|
|
interface ens3
|
|
|
|
|
virtual_router_id 50
|
|
|
|
|
interface ens19
|
|
|
|
|
virtual_router_id 1
|
|
|
|
|
priority 110
|
|
|
|
|
advert_int 1
|
|
|
|
|
mcast_src_ip 192.168.X.1
|
|
|
|
|
virtual_ipaddress {
|
|
|
|
|
10.30.10.100
|
|
|
|
|
10.160.179.25/24
|
|
|
|
|
}
|
|
|
|
|
track_script {
|
|
|
|
|
check_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
|
|
|
|
|
virtual_routes {
|
|
|
|
|
default via 10.160.179.1
|
|
|
|
|
}
|
|
|
|
|
track_script {
|
|
|
|
|
check_nginx
|
|
|
|
|
chech_nginx
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# 4.
|
|
|
|
|
Создайте скрипт для проверки работы nginx `/etc/keepalived/check_nginx.sh`.
|
|
|
|
|
Cлужебная информация (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
|
|
|
|
|
# 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
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Welcome to nginx!</title>
|
|
|
|
|
<style>
|
|
|
|
|
body {
|
|
|
|
|
width: 35em;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
font-family: Tahoma, Verdana, Arial, sans-serif;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Welcome to nginx web01!</h1>
|
|
|
|
|
<p>If you see this page, the nginx web server is successfully installed and
|
|
|
|
|
working. Further configuration is required.</p>
|
|
|
|
|
<p>For online documentation and support please refer to
|
|
|
|
|
<a href="http://nginx.org/">nginx.org</a>.<br/>
|
|
|
|
|
Commercial support is available at
|
|
|
|
|
<a href="http://nginx.com/">nginx.com</a>.</p>
|
|
|
|
|
<p><em>Thank you for using nginx.</em></p>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
## 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
|