# Задания

Источник: https://j3ffyang.medium.com/nginx-high-availability-and-load-balancing-with-keepalived-521d44798bff

Nginx  в настройке с высокой доступностью (HA) активной передачей (HA) на основе KeepAlive.

Проект `keepalived` включает в себя три компонента:
- демон-watchdog, контролирующий работоспособность двух других компонентов,
- реализация сетевого протокола 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 ваш идентификатор.

## 1.
Установите nginx и keepalived на узлы:
```
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.

На первом сервере:
```
! 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 MASTER
    interface ens3
    virtual_router_id 50
    priority 110
    advert_int 1
    virtual_ipaddress {
	10.30.10.100
    }
    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
    }
    track_script {
	check_nginx
    }
}
```

# 4.
Создайте скрипт для проверки работы nginx `/etc/keepalived/check_nginx.sh`.

```
#!/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>

```


# Релевантные источники
- 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