我已经在 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 之间的中间。