Як налаштувати Nginx для балансування навантаження

Nginx є потужним і швидким веб-сервером, який також може використовуватися як балансувальник навантаження. Це означає, що Nginx може розподіляти запити між кількома серверами, щоб зменшити навантаження на кожен із них і забезпечити високу доступність додатка. У цій статті ми розглянемо, як налаштувати Nginx як балансувальник навантаження.

Роль балансування навантаження в побудові відмовостійкого кластера

Балансування навантаження — це ключовий елемент у побудові відмовостійкого кластера, який може забезпечити високу доступність та надійність веб-додатків.

Основна роль балансування навантаження в кластері полягає в розподілі запитів від клієнтів між кількома серверами в кластері. Коли клієнт відправляє запит до додатка, балансувальник навантаження приймає рішення, на який сервер у кластері має бути направлено запит. Це дозволяє балансувальнику навантаження розподілити навантаження між усіма серверами в кластері, запобігаючи перевантаженню і забезпечуючи високу доступність.

Якщо один із серверів у кластері не працює через збій або обслуговування, балансувальник навантаження автоматично перенаправить запити на інший сервер, який може продовжити обробку запитів. Це забезпечує високу доступність додатка, навіть якщо один або декілька серверів у кластері не працюють.

Крім того, балансувальник навантаження може управляти з’єднаннями з клієнтами та серверами в кластері, щоб запобігти перевантаженню серверів і забезпечити рівномірний розподіл навантаження між усіма серверами в кластері. Це також може покращити продуктивність додатка і зменшити затримки при обробці запитів.

Перед тим як перейти до встановлення та налаштування Nginx як балансувальника навантаження, давайте розглянемо роль front-end сервера в архітектурі додатка. Front-end сервер — це сервер, який приймає запити від клієнтів і передає їх на backend-сервери. Front-end сервер може виконувати такі функції, як SSL-термінація, маршрутизація запитів і балансування навантаження.

Налаштування Nginx для балансування навантаження

Першим кроком у встановленні та налаштуванні Nginx для балансування навантаження є встановлення самого Nginx. Для цього необхідно виконати наступні команди в терміналі:

sudo apt-get update
sudo apt-get install nginx

Після встановлення Nginx необхідно налаштувати його як балансувальник навантаження. Для цього потрібно змінити конфігураційний файл /etc/nginx/nginx.conf. Приклад конфігураційного файлу для балансування навантаження між двома серверами виглядає наступним чином:

http {
    upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com;
    }

    server {
        listen 80;
        server_name example.com;

        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-блок, який містить список серверів, на які будуть розподілятися запити. Ми також визначили server-блок, який вказує, як проксирувати запити на наш backend. Важливо пам’ятати, що ми також можемо налаштувати балансування навантаження для HTTPS запитів, для чого необхідно налаштувати SSL-термінацію на front-end сервері.

Розподіл ваги серверів при балансуванні та використання методу RoundRobin

При балансуванні навантаження з використанням методу RoundRobin важливо розуміти, що Nginx може розподіляти запити між серверами з урахуванням ваги, заданої для кожного сервера. Вага визначає, скільки запитів буде відправлено на кожен сервер за одиницю часу. Наприклад, якщо у сервера задана вага 2, то на нього буде відправлено у два рази більше запитів, ніж на сервер з вагою 1:

upstream backend { 
    server backend1.example.com weight=2; 
    server backend2.example.com weight=1; 
}

Таким чином ви можете розподіляти кількість запитів, виходячи з продуктивності сервера, віддаючи перевагу тим backend-серверам, технічні характеристики яких вищі і які, відповідно, можуть обробити більше запитів.

Метод RoundRobin означає, що запити будуть відправлятися по черзі на кожен сервер у порядку, визначеному в upstream-блоці. Це означає, що перший запит буде відправлено на перший сервер, другий запит — на другий сервер і так далі. Після відправлення запиту на останній сервер, наступний запит знову буде відправлено на перший сервер і так далі.

Крім того, метод RoundRobin можна використовувати не лише для балансування навантаження Nginx, але й інших сервісів. Ми вже розглядали використання цього методу RoundRobin для балансування DNS запитів за допомогою PowerDNS.

Перевірка доступності Backend серверів

При використанні Nginx як балансувальника навантаження необхідно регулярно перевіряти доступність backend серверів. Це допомагає забезпечити високу доступність та надійність додатка.

У Nginx для перевірки доступності backend серверів використовується модуль ngx_http_healthcheck_module. Цей модуль дозволяє відправляти тестові запити до backend серверів і перевіряти їх доступність. Якщо backend сервер не відповідає на запити, Nginx тимчасово виключає його зі списку доступних серверів.

Для налаштування перевірки доступності backend серверів у Nginx необхідно додати блок “upstream” у конфігураційний файл і вказати параметр “health_check”:

upstream backend {
    server backend1.example.com;
    server backend2.example.com;

    # Перевірка доступності серверів
    health_check interval=5s;
}

У цьому прикладі Nginx перевірятиме доступність серверів кожні 5 секунд.

Налаштування балансувальника для HTTPS запитів

Для налаштування балансувальника навантаження для HTTPS запитів необхідно налаштувати SSL-термінацію на front-end сервері. SSL-термінація означає, що шифрування HTTPS-з’єднання буде завершено на front-end сервері, а потім запити будуть відправлятися на backend-сервери у вигляді звичайних HTTP запитів.

Для налаштування SSL-термінації у Nginx необхідно виконати наступні кроки:

  1. Згенерувати самопідписаний SSL-сертифікат:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt
  1. Додати наступні рядки у конфігураційний файл /etc/nginx/nginx.conf
http {
    ...

    # SSL-конфігурація
    ssl_certificate /etc/nginx/cert.crt;
    ssl_certificate_key /etc/nginx/cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA
-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

...
}
  1. Додати наступні рядки у блок server для HTTPS запитів:
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/cert.crt;
    ssl_certificate_key /etc/nginx/cert.key;

    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;
        proxy_set_header X-Forwarded-Proto https;
    }
}

 

У цьому прикладі example.com — це ім’я вашого домену, а backend — це ім’я вашого upstream-блоку. Ви також повинні замінити шляхи ssl_certificate і ssl_certificate_key на шляхи до ваших SSL-сертифікатів.

Ці рядки налаштовують Nginx для прийняття HTTPS запитів, використовуючи SSL-сертифікати, і передачі їх на backend-сервер за допомогою налаштованого upstream-блоку. Крім того, ці рядки додають заголовки Host, X-Real-IP, X-Forwarded-For і X-Forwarded-Proto для обробки запитів на backend-сервері.

Висновок

У цій статті ми розглянули процес встановлення та налаштування Nginx як балансувальника навантаження. Ми описали роль front-end сервера та пояснили, чому використання балансувальника навантаження є важливим елементом при побудові відмовостійкого кластера.

Ми також обговорили методи розподілу ваги серверів при балансуванні та використання методу RoundRobin, а також розглянули налаштування балансувальника для HTTPS запитів.

Сподіваємося, що ця стаття допоможе вам встановити та налаштувати Nginx як балансувальника навантаження для вашого додатка. Використання балансувальника навантаження може допомогти забезпечити високу доступність та надійність вашого додатка, а також знизити навантаження на сервери в кластері.

Необхідно пам’ятати, що налаштування балансувальника навантаження — це процес, який вимагає певних знань та досвіду. Якщо у вас виникнуть проблеми в процесі налаштування, не соромтеся звертатися до документації та до спільноти, яка завжди готова допомогти. Дякуємо за увагу та успішного налаштування!

 

Оцініть статтю