Если ты работаешь с высоконагруженными проектами или планируешь масштабировать свой сайт, то сегодня для тебя важная тема — балансировка нагрузки с помощью Nginx. Это умение превращает сервер в настоящего дирижёра, который управляет запросами, распределяя их между несколькими бекендами.
Давай разбираться, как это работает, и настраивать балансировку в Nginx.
Зачем нужна балансировка нагрузки?
Когда у сайта растёт аудитория, один сервер уже не справляется с потоком запросов. Например:
- Когда трафик достигает тысячи пользователей в час, сервер начинает испытывать перегрузку и терять производительность.
- Запросы на бекенд обрабатываются слишком медленно, сайт тормозит.
- Если сервер падает, весь сайт становится недоступным.
Балансировка решает эти проблемы, распределяя запросы между несколькими серверами.
Как работает балансировка?
Основная идея:
У тебя есть несколько бекендов, например:
- http://backend1.local:8000
- http://backend2.local:8000
Nginx становится «диспетчером», который:
- Получает запрос от пользователя.
- Выбирает, на какой сервер отправить запрос.
- Возвращает ответ пользователю.
Результат: нагрузка равномерно распределяется между серверами.
Типы балансировки в Nginx
Round Robin
Запросы направляются по очереди:
- 1-й запрос → 1-й сервер.
- 2-й запрос → 2-й сервер.
- 3-й запрос → снова 1-й сервер.
Least Connections
Запрос направляется на сервер с минимальным количеством текущих соединений.
IP Hash
Запросы от одного и того же IP направляются всегда на один и тот же сервер.
Настраиваем балансировку нагрузки
Шаг 1: Готовим несколько бекендов
Для примера запустим два сервера на FastAPI.
Первый сервер (backend1)
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello from Backend 1"}
Запусти сервер:
uvicorn backend1:app --host 127.0.0.1 --port 8000
Второй сервер (backend2)
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello from Backend 2"}
Запусти второй сервер:
uvicorn backend2:app --host 127.0.0.1 --port 8001
Теперь у нас есть два сервера:
- http://127.0.0.1:8000
- http://127.0.0.1:8001
Шаг 2: Настраиваем балансировку в Nginx
Открой конфигурацию Nginx (например, /etc/nginx/sites-available/default) и добавь следующее:
upstream backend {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
server {
listen 80;
server_name mysite.local;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Что здесь происходит?
- upstream backend определяет пул серверов для балансировки.
- proxy_pass http://backend; указывает, что запросы перенаправляются на пул серверов.
Перезапусти Nginx:
sudo systemctl reload nginx
Шаг 3: Настраиваем алгоритм балансировки
Round Robin (по умолчанию)
Запросы распределяются по очереди между серверами.
Least Connections
Добавь строку least_conn в блок upstream:
upstream backend {
least_conn;
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
IP Hash
Если тебе важно, чтобы пользователь всегда попадал на один и тот же сервер, используй ip_hash:
upstream backend {
ip_hash;
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
Дополнительные настройки
Вес серверов
Если один сервер мощнее другого, можно указать вес:
upstream backend {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001 weight=1;
}
Проверка состояния серверов
Добавь параметр max_fails:
upstream backend {
server 127.0.0.1:8000 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8001;
}
Задание для самостоятельной практики
- Настрой пул серверов для своего сайта.
- Попробуй разные алгоритмы балансировки (Round Robin, Least Connections, IP Hash).
- Проверь, как работает отключение серверов при сбоях.
- Настрой вес серверов и оцени распределение нагрузки.
Балансировка нагрузки – это основа для построения масштабируемых и надёжных приложений. В следующей статье мы разберём, как настроить кэширование в Nginx, чтобы ещё больше ускорить работу сайта.