Назад | Перейти на главную страницу

Почему мой балансировщик нагрузки Nginx проксирует только первый сервер?

У меня есть балансировщик нагрузки, использующий Nginx из Серверы для хакеров учебный сайт. Это относится к двум серверам в циклической настройке. У меня есть самоподписанный SSL сертификат для проверки http к https перенаправить.

Когда я получаю доступ к IP-адресу балансировщика нагрузки, запрос пересылается только на первый IP-адрес в upstream app блок. Я хочу разделить его на 50/50.

Посмотрев на файл конфигурации, может кто-нибудь подскажет, как это сделать? Все это экземпляры Amazon ec2.

Редирект работает с http к https и прокси работает с первым сервером.

upstream app {
    server 172.31.33.5:80 weight=1;
    server 172.31.42.208:80 weight=1;
}

server {
    listen 80 default_server;

    # Requests to /.well-known should look for local files
    location /.well-known {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }

    # All other requests get load-balanced
    location / {
        return 301 https://$http_host$request_uri;
    }
}

server {
    listen 443 ssl default_server;


    ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
    ssl_prefer_server_ciphers  on;
    ssl_session_cache          shared:SSL:10m;
    ssl_session_timeout        24h;
    keepalive_timeout          300s;

    ssl_certificate      /etc/pki/tls/certs/load_balance.crt;
    ssl_certificate_key  /etc/pki/tls/certs/load_balance.key;

    charset utf-8;

    location / {
        include proxy_params;
        proxy_pass http://app;
        proxy_redirect off;

        # Handle Web Socket connections
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Журнал отладки. fastcgi.conf ngix.conf Файлы nginx

weight=1 - это конфигурация по умолчанию, поэтому ее явное указание или удаление и неявное использование не имеют никакого значения.

В целом ваша конфигурация выглядит правильно.

Попробуйте удалить рабочий сервер из списка вышестоящих и оставить только один, который не работает. Я подозреваю, что это вообще не сработает из-за проблем с маршрутизацией или брандмауэром.

Не отвечая напрямую на ваш вопрос, лучшее решение вашей проблемы - использовать Балансировщик нагрузки приложений AWS. Это достаточно хорошо оснащенный балансировщик нагрузки для базовых и стандартных вариантов использования. Возможно, вам придется свернуть свою собственную, если у вас есть действительно особые требования.

AWS ALB - это сервис высокой доступности без единой точки отказа, работающий в нескольких зонах доступности. Это сделает его намного более надежным, чем отдельный экземпляр, и может быть экономически эффективным по сравнению с запущенными экземплярами. Иногда это будет стоить немного дороже, но вы получите от этого выгоду.

Я согласен с Сергеем. Вполне возможно, что существует некоторая проблема с брандмауэром, когда один сервер не получает трафик, из-за чего nginx удаляет его из пула доступных серверов.

Сбросьте вес = 1, и он должен работать