Skip to content

Настройка балансировки на базе Nginx (ip_hash)

shcema

В статье была рассмотрена настройка балансировщика на базе Nginx в «RedOS 7.3.1».

В данном варианте балансируемые сервера поднчты на TLS, и сам собственно балансировщик на Nginx тоже будет на SSL/TLS.

1. Установите Nginx с репозиториев

bash
dnf install nginx

2. Создайте каталог /etc/nginx/upstreams

В каталоге будут указаны балансируемые сервера и каталог /etc/nginx/conf.ks, куда необходимо поместить файл bot_blocked.conf.

bot_blocked.conf – файл с http_user_agent.

bash
mkdir -p /etc/nginx/upstreams 
mkdir -p /etc/nginx/conf.ks

3. Создайте файл /etc/nginx/upstreams/upstream-budget.conf

Где upstream-budget.conf - имя сервера

bash
nano /etc/nginx/upstreams/upstream-budget.conf

С содержимым:

 upstream upstream-budget {  
   # ip_hash;  
   hash $remote_addr consistent; 
   server 10.10.0.141:443 max_fails=3 fail_timeout=60s; 
   server 10.10.0.143:443 max_fails=3 fail_timeout=60s; 
 }

Здесь вместо 10.10.0.141:443 и 10.10.0.143:443 укажите свои балансируемые сервера. Если порт отличен от 80, то обязательно укажите порт как показано в примере!

  • ip-hash - используется хэш функция, основанная на клиентском ip адресе, для определения, куда направить следующий запрос. Используется для привязки клиента к одному и тому же серверу. В предыдущих методах один и тот же клиент может попадать на разные серверы.

  • max_fails - задает количество неудачных попыток связи с сервером, которое должно произойти в течение времени, заданного параметром, fail_timeout чтобы считать сервер недоступным в течение времени, также заданного fail_timeout параметром. По умолчанию количество неудачных попыток равно 1. Нулевое значение отключает учет попыток.

4. Поместите сертификаты SSL в /etc/nginx/ssl

5. Отредактируйте /etc/nginx/nginx.conf предварительно сделав копию

bash
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak 
nano /etc/nginx/nginx.conf

с содержимым:

nginx.conf
    user nginx;
    worker_processes auto; 
    error_log /var/log/nginx/error.log notice; 
    pid /run/nginx.pid; 
    
    # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. 
    include /usr/share/nginx/modules/*.conf; 
    
    events { 
        worker_connections 1024; 
    } 
    
    http { 
        log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
                '$status $body_bytes_sent "$http_referer" ' 
                '"$http_user_agent" "$http_x_forwarded_for"'; 
        
        access_log /var/log/nginx/access.log main; 
        
        sendfile    on; 
        tcp_nopush    on; 
        keepalive_timeout 65; 
        types_hash_max_size 4096; 
        client_max_body_size 100M; 
        server_tokens off; 
        
        include     /etc/nginx/mime.types; 
        default_type    application/octet-stream; 
        include /etc/nginx/upstreams/*.conf; ## тут адреса балансируемых серверов 
        
        server { 
            listen  443 ssl;
            listen  [::]:443 ssl;
            http2 on;
            server_name localhost; 
            include /etc/nginx/conf.ks/bot_blocked.conf;
            
            ssl_certificate "/etc/nginx/ssl/wsks-19.08_demo.crt";
            ssl_certificate_key "/etc/nginx/ssl/wsks-19.08_demo.key";
            ssl_protocols TLSv1.2 TLSv1.3; 
            ssl_prefer_server_ciphers on; 
            
            ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; 
            ssl_ecdh_curve          secp384r1; 
            ssl_session_cache       shared:SSL:10m; 
            ssl_session_tickets     off; 
            ssl_stapling        on; 
            ssl_stapling_verify     on; 
            
            access_log /var/log/nginx/budget-access.log;
            error_log /var/log/nginx/budget-error.log;
            
            proxy_next_upstream error timeout http_502;
            proxy_next_upstream_tries 0;
            
            location / 
            { 
                proxy_pass https://upstream-budget;
                proxy_set_header Upgrade $http_upgrade; 
                proxy_set_header Connection "Upgrade"; 
                proxy_set_header Host $host:$server_port; 
                proxy_cache_bypass $http_upgrade; 
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
                proxy_set_header X-Forwarded-Proto $scheme;
                
                proxy_read_timeout 1800; 
                proxy_connect_timeout 1800; 
                proxy_send_timeout 1800; 
                proxy_buffer_size 64k; 
                proxy_buffers 4 64k; 
                proxy_busy_buffers_size 64k; 
            }
            location /ngstat 
            { 
                # укажите IP, с которых разрешен доступ к статистике 
                allow 127.0.0.1; 
                deny all; 
                stub_status; 
                server_tokens on; 
            } 
        } 
    }

При необходимости измените:

  • имена сертификатов, параметр ssl_certificate;
  • параметр proxy_pass (к примеру на torgi) и access_log, error_log;
  • вместо user nginx укажите пользователя из файла «/etc/nginx/nginx.conf.bak».

Предоставьте этому пользователю права на сертификаты:

bash
chown -R nginx:nginx /etc/nginx/ssl 
chmod -R 750 /etc/nginx/ssl

И предоставьте этому пользователю права на файл с http_user_agent

bash
chown -R nginx:nginx /etc/nginx/conf.ks 
chmod -R 750 /etc/nginx/conf.ks

6. Пропишите правила SELinux при его наличии (sestatus)

Во избежание ошибок вида: *2 connect() to 10.10.0.141:443 failed (13: Permission denied) while connecting to upstream.

bash
setsebool -P httpd_can_network_connect 1

Cбросьте разрешения SeLinux на местоположение «cannot load certificate "/etc/nginx/ssl/wsks-19.08_demo.crt": BIO_new_file() failed (SSL: error:0200100D:system library:fopen:Permission denied»:

bash
restorecon /etc/nginx/ssl/*.*

7. Перезапустите Nginx и проверьте работу

bash
systemctl enable nginx --now 
systemctl restart nginx 
systemctl status nginx

8. Скорректируйте правило ротации логов

bash
nano /etc/logrotate.d/nginx
nginx
daily 
rotate 3 
size 10M

или

nginx
    /var/log/nginx/*.log { 
        create 0640 nginx root 
        daily 
        rotate 10 
        missingok 
        notifempty 
        compress 
        delaycompress 
        sharedscripts
        postrotate 
            /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true 
        endscript 
    }

Дополнительно

Перечитать конфигурацию без перезапуска Nginx

bash
service nginx reload nginx -s reload

По адресу /ngstat доступна следующая информация

  • Active connections - текущее число активных клиентских соединений, включая Waiting-соединения.
  • Accepts - суммарное число принятых клиентских соединений.
  • Handled - суммарное число обработанных соединений. Как правило, значение этого параметра такое же, как accepts, если не достигнуто какое-нибудь системное ограничение (например, лимит worker_connections).
  • Requests - суммарное число клиентских запросов.
  • Reading - текущее число соединений, в которых nginx в настоящий момент читает заголовок запроса.
  • Writing - текущее число соединений, в которых nginx в настоящий момент отвечает клиенту.
  • Waiting - текущее число бездействующих клиентских соединений в ожидании запроса.

© 2003—2025 ООО «Кейсистемс». Все права защищены.