@dake1231

Как правильно организовать балансировку нагрузки?

Здравствуйте! Сервера организованы так - есть главный с балансировщиком нгинкс, используется upstream и 3 веб - сервера, на одном из них БД
Вот настройки балансировщика
upstream servers {
                server ip1;
                server ip2;
                server ip3;
                keepalive 16;
        }
server {
                listen 80;

                location / {
                        proxy_pass http://servers;
                        proxy_http_version 1.1;
                        proxy_set_header Connection "";
        }


Все три веб сервера имеют одинаковые настройки
location ~ \.php$ {
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass 127.0.0.1:7777;
                try_files $uri =404;
                fastcgi_read_timeout 150;
        }

В часы пик получаю
upstream timed out (110: Connection timed out) while reading response header from upstream, client: 127.0.0.1, server: domain_name, request: "GET /api/endpoint HTTP/1.1", upstream: "fastcgi://127.0.0.1:7777", host: "domain_name"
  • Вопрос задан
  • 835 просмотров
Пригласить эксперта
Ответы на вопрос 1
Если Вы уверены, что Web-приложение справляется с нагрузкой, то возможно на балансировщике стоит увеличить таймауты, добавьте в location /

proxy_connect_timeout 120s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;


На 3-х вебсерверах если Вы используете php-fpm то лучше работать через unix-сокеты, а не через tcp, через сокеты будет быстрее.

Возможно стоит посмотреть в сторону параметра least_conn в upstream, то есть запросы сначала будут отправляются бэкенду с наименьшим количеством активных подключений (но с учетом весов). Подробнее тут.
Если какой-то бэкенд мощнее других, то используйте определение веса через weight
Так же настройте директивы max_fails и fail_timeout в блоке upstream (в моем примере ниже параметры проставлены для примера).

Так же включите логи на балансировщике, это сильно упростит отладку:

http {
    ...
    log_format upstream_log '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';

upstream servers {
                least_conn;
                server ip1;
                server ip2 max_fails=3 fail_timeout=30s;
                server ip3 max_fails=5 fail_timeout=30s;
                keepalive 16;
        }

server {
                listen 80;
                access_log /var/log/nginx/servers-access.log upstream_log;
                error_log /var/log/nginx/servers-error.log debug;

                location / {
                        proxy_pass http://servers;
                        proxy_http_version 1.1;
                        proxy_set_header Connection "";
                        proxy_connect_timeout 120s;
                        proxy_send_timeout 120s;
                        proxy_read_timeout 120s;
        }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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