You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
7.0 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Задания
Источник: 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