Вот перевод текста на русский язык:

Введение в Nginx и балансировку нагрузки

В мире веб-разработки обработка большого трафика является задачей, с которой сталкиваются многие разработчики и системные администраторы. Один из самых эффективных способов управления этим — балансировка нагрузки, и одним из самых популярных инструментов для этой задачи является Nginx. В этой статье мы рассмотрим мир Nginx, изучим, как настроить его для балансировки нагрузки и оптимизировать его производительность при больших нагрузках.

Что такое Nginx?

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

Настройка балансировки нагрузки с помощью Nginx

Прежде чем углубляться в оптимизацию, давайте настроим базовую конфигурацию балансировки нагрузки с Nginx.

Настройка блока upstream

Блок upstream в Nginx определяет серверы, которые будут обрабатывать трафик. Вот пример конфигурации:

http {
    upstream application {
        server 10.2.2.11;
        server 10.2.2.12;
        server 10.2.2.13;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://application;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

В этом примере мы определяем три сервера в блоке upstream и настраиваем блок server, чтобы он слушал порт 80 и передавал запросы группе application upstream.

Балансировка по методу «кругового перебора» и взвешенная балансировка

По умолчанию Nginx использует метод «кругового перебора», чтобы распределять трафик между серверами. Однако вы можете назначить веса серверам, чтобы распределить трафик в зависимости от их пропускной способности:

upstream application {
    server 10.2.2.11 weight=5;
    server 10.2.2.12 weight=3;
    server 10.2.2.13 weight=1;
}

Эта конфигурация гарантирует, что сервер с наибольшим весом получит больше трафика.

Метод наименьшего количества соединений

Чтобы избежать перегрузки какого-либо одного сервера, вы можете использовать метод least_conn, который направляет трафик на сервер с наименьшим количеством активных соединений:

upstream application {
    least_conn;
    server 10.2.2.11 weight=5;
    server 10.2.2.12 weight=3;
    server 10.2.2.13 weight=1;
}

Этот подход помогает поддерживать сбалансированную нагрузку на всех серверах.

Оптимизация производительности Nginx

Обновление Nginx

Регулярное обновление Nginx имеет решающее значение для производительности и безопасности. Регулярно обновляйте свою установку Nginx, чтобы убедиться, что у вас есть последние функции и исправления.

Включение сжатия Gzip

Сжатие Gzip значительно уменьшает размер файлов HTML, CSS и JavaScript, ускоряя передачу данных, особенно для клиентов с медленными сетевыми подключениями.

Чтобы включить сжатие Gzip, добавьте следующее в свой конфигурационный файл Nginx:

http {
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}

Эта конфигурация включает сжатие Gzip для различных типов файлов и устанавливает уровень сжатия равным 6, что является хорошим балансом между степенью сжатия и использованием процессора.

Оптимизация рабочих процессов и соединений

Nginx использует рабочие процессы для обработки клиентских запросов. Оптимизация количества рабочих процессов и подключений может существенно повлиять на производительность.

Вот как вы можете оптимизировать эти настройки:

http {
    worker_processes auto;
    worker_connections 1024;
}

Директива worker_processes auto указывает Nginx использовать количество доступных ядер ЦП, а worker_connections 1024 устанавливает количество подключений, которое каждый рабочий процесс может обрабатывать. Настройте эти значения в соответствии с ресурсами вашего сервера и ожидаемым трафиком.

Кэширование

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

Вот пример того, как настроить кэширование:

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        listen 80;
        location / {
            proxy_cache cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_pass http://application;
        }
    }
}

Эта настройка создаёт зону кэша и определяет поведение кэширования для разных кодов состояния HTTP.

Ограничение скорости запросов

Чтобы предотвратить DoS-атаки и обеспечить доступность сервера при большой нагрузке, вы можете ограничить скорость запросов с помощью модуля limit_req Nginx.

Вот пример конфигурации:

http {
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    limit_req zone=req_limit burst=20;

    server {
        listen 80;
        location / {
            limit_req;
            proxy_pass http://application;
        }
    }
}

Эта настройка ограничивает скорость запроса до 10 запросов в секунду с всплеском 20 запросов.

Мониторинг и тестирование

Мониторинг Nginx

Мониторинг вашего сервера Nginx крайне важен для выявления узких мест производительности. Вы можете использовать такие инструменты, как nginx -s reload, для перезагрузки конфигурации без простоя, и nginx -t, чтобы проверить конфигурацию на наличие синтаксических ошибок.

Вот пример мониторинга Nginx с использованием команды nginx:

sudo nginx -t
sudo systemctl reload nginx

Тестирование производительности

Для тестирования производительности вашей настройки Nginx вы можете использовать инструменты бенчмаркинга, такие как ab (Apache Benchmark), или более продвинутые инструменты, такие как Test и Lighthouse.

Вот пример использования ab для тестирования производительности вашего сервера:

ab -n 1000 -c 100 http://yourdomain.com/

Эта команда отправляет 1000 запросов с параллелизмом 100 на ваш сервер, предоставляя информацию о том, как ваш сервер обрабатывает большие нагрузки.

Заключение

Оптимизация Nginx для больших нагрузок включает в себя правильную конфигурацию, кэширование, сжатие и мониторинг. Следуя шагам, описанным в этой статье, вы сможете значительно повысить производительность и надёжность своего веб-сервера.