我已经在Elastic Beanstalk上启动并运行了一个Docker应用程序,并且注意到它偶尔会超时并将504 Gateway Timeout
返回给来自Internet的请求。为了调试这个,我创建了一个脚本,我正在我的本地机器上运行,它不断向我的应用程序发送完全相同的请求,并告诉我它是否收到了除200
响应之外的任何内容。这是输出的摘录:
[21:38:14] Success
[21:38:15] Success
[21:38:15] Success
[21:39:15] Non 200 code: 504
[21:40:15] Non 200 code: 504
[21:41:15] Non 200 code: 504
[21:42:15] Non 200 code: 504
[21:43:15] Non 200 code: 504
[21:44:15] Success
[21:44:15] Success
[21:44:16] Success
我想知道504
请求是否甚至命中了我的EC2实例,所以我检查了它的nginx日志:
172.31.8.21 - [01/Mar/2015:21:38:15 +0000] "GET /v1/jobs HTTP/1.1" 200 5
172.31.8.21 - [01/Mar/2015:21:38:15 +0000] "GET /v1/jobs HTTP/1.1" 200 5
172.31.8.21 - [01/Mar/2015:21:38:15 +0000] "GET /v1/jobs HTTP/1.1" 200 5
172.31.23.11 - [01/Mar/2015:21:39:15 +0000] "GET /v1/jobs HTTP/1.1" 400 0
172.31.23.11 - [01/Mar/2015:21:40:15 +0000] "GET /v1/jobs HTTP/1.1" 400 0
172.31.23.11 - [01/Mar/2015:21:41:15 +0000] "GET /v1/jobs HTTP/1.1" 400 0
172.31.23.11 - [01/Mar/2015:21:42:15 +0000] "GET /v1/jobs HTTP/1.1" 400 0
172.31.23.11 - [01/Mar/2015:21:43:15 +0000] "GET /v1/jobs HTTP/1.1" 400 0
综观日志,似乎负载平衡器发送到我的EC2实例,它然后超时60秒后这使得负载平衡器返回504
,并纪录400
到我的nginx的请求日志。真正奇怪的是504
请求的IP地址与其他每个成功请求的IP地址不同。
据我了解,这是在Docker Elastic Beanstalk应用程序中处理请求的拓扑结构:
request -> load balancer -> load balancer proxy -> EC2 instance -> EC2 instance proxy -> Docker image
所以我检查了Docker镜像中的nginx日志,并且在负载均衡器返回access.log
时的时间段内没有504
个条目。
这意味着由于某种原因,请求将转到EC2实例代理,然后超时。有没有人遇到过这个问题,知道为什么吗?我还想知道为什么只有在172.31.23.11
IP地址是请求的地址时才会发生超时。
值得注意的是,当超时发生时,我的EC2实例上的nginx在其error.log
中没有报告任何内容。