Lopar
@Lopar
системный администратор

Балансировка нагрузок на NGiNX?

Товарищи, уже невмоготу. Есть у меня нужда сбалансировать нагрузки используя nginx на кластер. Балансирую посредством ngx_http_upstream_module и proxy_pass. В мануалах всё описано на удивление элементарно, но…

nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}
 
http {
    upstream apps {
        server 192.168.1.237:8080;
        server 192.168.1.240:8080;
    }

    server {
        listen  80;
        server_name _;

        location / {
            proxy_pass http://apps;
        }
    }
}


В таком варианте 192.168.1.135 возвращало мне «The page you are looking for is temporarily unavailable. Please try again later», несмотря на то, что 192.168.1.237 и 192.168.1.240 пинговались, по ссылкам с портом 8080 открывались, curl, wget с сервера-балансировщика на конечные хосты работают, elinks оттуда же нормально открывал сайты.

error.log пугал малопонятными:
2016/04/13 18:36:59 [crit] 5427#0: *20 connect() to 192.168.1.240:8080 failed (13: Permission denied) while connecting to upstream, client: 192.168.1.15, server: _, request: "GET / HTTP/1.1", upstream: "http://192.168.1.240:8080/", host: "192.168.1.135"
2016/04/13 18:36:59 [crit] 5427#0: *20 connect() to 192.168.1.237:8080 failed (13: Permission denied) while connecting to upstream, client: 192.168.1.15, server: _, request: "GET / HTTP/1.1", upstream: "http://192.168.1.237:8080/", host: "192.168.1.135"


На этом этапе у меня случился первый серьёзный затык, из которого меня вчера вывели (возможно ошибочно?), посоветовав сделать:
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp


После чего проблема перешла в новую стадию: при таком конфиге поход по айпишнику 192.168.1.135 переправляет не на айпи адреса, указанные в upstream, а на httр://apps буквально. И тут я уже завис всерьёз и надолго.

UPD 21042016: после плясок с бубном теперь upstream исправно берёт ip 192.168.1.135, пытаясь перенаправить куда надо, но, собака, сам приписывает себе порт ноды 8080, и пытается лезть на 192.168.1.135:8080, где ничего нет.

Товарищи, подскажите где я свернул не туда и что я делаю не так? Если верить многочисленным описаниям — вся настройка балансировщика простая как двери и запускается с полпинка…

Система: CentOS 7 Minimal.
  • Вопрос задан
  • 1505 просмотров
Решения вопроса 1
Lopar
@Lopar Автор вопроса
системный администратор
Работоспособный вариант:

location / {
   proxy_pass http://apps;
   proxy_redirect http://192.168.1.135:8080 http://192.168.1.135;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}


Учитывая, что исходная проблема с SELinux осталась, надо посмотреть в сторону getsebool -a | grep httpd, и если параметр http_can_network_connect выключен, надо включить его:
setsebool httpd_can_network_connect on -P

После чего система начинает работать как и задумано.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Fixid
Очень нехватает
proxy_pass http://00.00.00.00:80/zabbix/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Скорее все напортачили с конфигом. Напишите конфиг целиком.
semodule зря изменили, от этого вторая ошибка
Ответ написан
@DuD
Попробуйте отключить selinux и прочие щапрещалки в системе. Если поможет копайте в эту сторону.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы