Настройка балансировки на базе Nginx (ip_hash)
В статье была рассмотрена настройка балансировщика на базе Nginx в «RedOS 7.3.1».
В данном варианте балансируемые сервера поднчты на TLS, и сам собственно балансировщик на Nginx тоже будет на SSL/TLS.
1. Установите Nginx с репозиториев
dnf install nginx
2. Создайте каталог /etc/nginx/upstreams
В каталоге будут указаны балансируемые сервера и каталог /etc/nginx/conf.ks
, куда необходимо поместить файл bot_blocked.conf
.
bot_blocked.conf – файл с http_user_agent.
mkdir -p /etc/nginx/upstreams
mkdir -p /etc/nginx/conf.ks
3. Создайте файл /etc/nginx/upstreams/upstream-budget.conf
Где upstream-budget.conf - имя сервера
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
предварительно сделав копию
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
nano /etc/nginx/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».
Предоставьте этому пользователю права на сертификаты:
chown -R nginx:nginx /etc/nginx/ssl
chmod -R 750 /etc/nginx/ssl
И предоставьте этому пользователю права на файл с http_user_agent
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
.
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»
:
restorecon /etc/nginx/ssl/*.*
7. Перезапустите Nginx и проверьте работу
systemctl enable nginx --now
systemctl restart nginx
systemctl status nginx
8. Скорректируйте правило ротации логов
nano /etc/logrotate.d/nginx
daily
rotate 3
size 10M
или
/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
service nginx reload nginx -s reload
По адресу /ngstat доступна следующая информация
- Active connections - текущее число активных клиентских соединений, включая Waiting-соединения.
- Accepts - суммарное число принятых клиентских соединений.
- Handled - суммарное число обработанных соединений. Как правило, значение этого параметра такое же, как accepts, если не достигнуто какое-нибудь системное ограничение (например, лимит worker_connections).
- Requests - суммарное число клиентских запросов.
- Reading - текущее число соединений, в которых nginx в настоящий момент читает заголовок запроса.
- Writing - текущее число соединений, в которых nginx в настоящий момент отвечает клиенту.
- Waiting - текущее число бездействующих клиентских соединений в ожидании запроса.