亚马逊(AWS)负载平衡器和 Apache 间歇性出现 HTTP 502 错误

亚马逊(AWS)负载平衡器和 Apache 间歇性出现 HTTP 502 错误

我已经在 AWS 中设置了一个负载均衡器,它将流量路由到 Apache Ubuntu 服务器。

当我浏览我的 URL 时,有时一切都很顺利。然后我点击“刷新”按钮,在下载某些文件时开始收到 502 错误。每次都是不同的文件。

然后我再次点击“刷新”,一切正常。

我目前是唯一一个使用该服务器的人。

我的负载均衡器设置如下:

  • 可用区域:us-east-1a 和 us-east-1b
  • 安全组:开放80、443端口
  • 监听器:端口 80 重定向到端口 443,端口 443 转发到我的目标

我的目标组配置如下:

  • 目标类型:实例
  • 协议:HTTP:80
  • 负载均衡器:我的负载均衡器名称
  • 注册目标:我在每个区域都有 1 个实例在运行。

我的自动缩放组配置如下:

  • 所需容量:2
  • 最低容纳人数:2
  • 最大容量:5
  • 可用区域:us-east-1a、us-east-1b

我的 Apache 服务器配置了默认安装值,另外还有:

  • 保持活动状态
  • 超时 120
  • KeepAliveTimeout 120
  • 最大KeepAliveRequests 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 开发人员论坛

最后一篇日志其实给了我答案:

确保在 ALB/ELB 后面时未使用 Apache 的事件 MPM 模块(默认)。它会动态关闭连接。尝试使用 worker MPM。

我改变了我的 Apache 配置以使用 worker MPM,就目前情况而言,我没有遇到任何 502 错误。

答案2

我尝试了 worker 和 event MPM,但都没有完全消除随机 502。我最终切换到 prefork MPM,这为我解决了这个问题。这是在 Apache 上 ALB 和 Tomcat 之间的中间。

相关内容