Если ты работаешь с высоконагруженными проектами или планируешь масштабировать свой сайт, то сегодня для тебя важная тема — балансировка нагрузки с помощью Nginx. Это умение превращает сервер в настоящего дирижёра, который управляет запросами, распределяя их между несколькими бекендами.

Давай разбираться, как это работает, и настраивать балансировку в Nginx.

Зачем нужна балансировка нагрузки?

Когда у сайта растёт аудитория, один сервер уже не справляется с потоком запросов. Например:

  • Когда трафик достигает тысячи пользователей в час, сервер начинает испытывать перегрузку и терять производительность.
  • Запросы на бекенд обрабатываются слишком медленно, сайт тормозит.
  • Если сервер падает, весь сайт становится недоступным.

Балансировка решает эти проблемы, распределяя запросы между несколькими серверами.

Как работает балансировка?

Основная идея:

У тебя есть несколько бекендов, например:

  • http://backend1.local:8000
  • http://backend2.local:8000

Nginx становится «диспетчером», который:

  1. Получает запрос от пользователя.
  2. Выбирает, на какой сервер отправить запрос.
  3. Возвращает ответ пользователю.

Результат: нагрузка равномерно распределяется между серверами.

Типы балансировки в 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, чтобы ещё больше ускорить работу сайта.