Периодическая ошибка HTTP 502 с балансировщиком нагрузки Amazon (AWS) и Apache

Периодическая ошибка HTTP 502 с балансировщиком нагрузки Amazon (AWS) и Apache

Я настроил балансировщик нагрузки в AWS, который направляет трафик на сервер Apache Ubuntu.

Когда я просматриваю свой URL, иногда все идет хорошо. Затем я нажимаю кнопку «Обновить» и начинаю получать ошибки 502 при загрузке некоторых файлов. Каждый раз это разные файлы.

Затем я снова нажимаю «Обновить», и все становится нормально.

В настоящее время сервером пользуюсь только я.

Мой балансировщик нагрузки настроен следующим образом:

  • Зоны доступности: us-east-1a и us-east-1b
  • Группы безопасности: открыты порты 80 и 443
  • Прослушиватели: порт 80 перенаправляется на порт 443, порт 443 перенаправляется на мою цель

Моя целевая группа сформирована следующим образом:

  • Тип цели: экземпляр
  • Протокол: HTTP: 80
  • Балансировщик нагрузки: Имя моего балансировщика нагрузки
  • Регистрация целей: у меня запущено по одному экземпляру в каждой зоне.

Моя группа автоматического масштабирования настроена следующим образом:

  • Желаемая вместимость: 2
  • Минимальная вместимость: 2
  • Максимальная вместимость: 5
  • Зоны доступности: us-east-1a, us-east-1b

Мой сервер Apache настроен с использованием значений установки по умолчанию, а также:

  • KeepAlive вкл.
  • Тайм-аут 120
  • KeepAliveTimeout 120
  • Макс. запросы KeepAlive 100
  • AcceptFilter http нет
  • AcceptFilter https нет

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

Спасибо за вашу помощь

ИЗМЕНИТЬ 2020-08-27 15h39

Я включил журналы на VPC и на балансировщике нагрузки и обновил свою страницу. У меня была ошибка 502 на определенном файле.

В журналах балансировщика нагрузки я вижу запись 502 для определенного файла. Вот запись — в формате JSON — в которой я заменил все важные данные

[
  {
    "type": "h2",
    "time": "2020-08-27T19:20:52.547402Z",
    "elb": "app/web-server-load-balancer/**my-load-balancer-id**",
    "client:port": "*my-ip-address*:60831",
    "target:port": "10.0.0.106:80",
    "request_processing_time": 0,
    "target_processing_time": 0.013,
    "response_processing_time": -1,
    "elb_status_code": 502,
    "target_status_code": "-",
    "received_bytes": 45,
    "sent_bytes": 610,
    "request": "GET https://**my-url** HTTP/2.0",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36",
    "ssl_cipher": "ECDHE-RSA-AES128-GCM-SHA256",
    "ssl_protocol": "TLSv1.2",
    "target_group_arn": "**my-target-group-arn**",
    "trace_id": "Root=1-5f480794-150df3bcad7fd0ac6bdfc41c",
    "domain_name": "**my-domain-name**",
    "chosen_cert_arn": "session-reused",
    "matched_rule_priority": 0,
    "request_creation_time": "2020-08-27T19:20:52.534000Z",
    "actions_executed": "forward",
    "redirect_url": "-",
    "error_reason": "-",
    "target:port_list": "10.0.0.106:80",
    "target_status_code_list": "-",
    "classification": "-",
    "classification_reason": "-"
  }
]

Я не знаю, смогут ли эти данные помочь вам мне!

ИЗМЕНИТЬ 2020-08-31 (1)

Я открыл две виртуальные машины в брандмауэре, чтобы получить к ним прямой доступ. Когда я получаю прямой доступ к каждому серверу, я вообще не получаю ошибки 502. Когда я получаю доступ через балансировщик нагрузки, я получаю ошибку 502.

ИЗМЕНИТЬ 2020-08-31 (2)

Я изменил балансировщик нагрузки, чтобы направлять HTTP-трафик на экземпляр, а не перенаправлять его на порт 443.

На порту 80 я не получаю ошибки 502. Я много-много раз выполнял жесткое обновление и не получал 502. Как только я обращаюсь к балансировщику нагрузки по https, я начинаю получать ошибки 502. Я помню, что когда я напрямую обращаюсь к виртуальной машине по https, я не получаю 502.

решение1

Я наткнулся на этот пост на форуме: Форум разработчиков AWS

Последняя запись на самом деле дала мне ответ:

Убедитесь, что вы не используете модуль Apache's event MPM (по умолчанию) за ALB/ELB. Он динамически закрывает соединения. Попробуйте worker MPM.

Я изменил конфигурацию Apache для использования Worker MPM, и, насколько мне известно, у меня не возникло ни одной ошибки 502.

решение2

Я пробовал и рабочие, и событийные MPM, и ни один из них не устранил полностью случайный 502. В конце концов я переключился на prefork MPM, и это решило проблему для меня. Это на Apache посередине между ALB и Tomcat.

Связанный контент