最近我的亚马逊 AWS Elastic Beanstalk 环境总是出现 503 错误。
上面部署的是一个 Nginx 反向代理,用来指向其他 ELB 的环境。这个代理是完全 Docker 化过的,只暴露 80 端口 (没有 HTTPS 支持)。
ELB 环境使用亚马逊默认设置,没有更改过:Web Server 类,负载均衡,自动扩展,并且只支持 80 端口 (HTTP)。
然后我的域名通过 CloudFlare CNAME 到 ELB 的域名,并且使用 CloudFlare 的 Flexible HTTPS。
所以基本请求流程应该是这样的:
用户请求 -> CloudFlare CDN 解密 HTTPS 并通过 HTTP 请求 -> 亚马逊 ELB 负载均衡 -> Nginx 反向代理 -> 服务 ELB 环境负载均衡 -> 程序服务器
但是这个时候如果通过 HTTPS 访问,总是会给我 503,没有任何错误信息。这就很尴尬了啊,我看了反向代理的
Log,基本如下:
172.31.43.168 - - [09/Dec/2017:17:46:30 +0000] "\x16\x03\x01\x00\x8F\x01\x00\x00\x8B\x03\x03qkJ\xC8u\xC1\xB48\xF2\xABA\x95\xC6!\xB3\xC7\xB8,\x92\xF6@\x10s\xEE\x9C\xED\xAB-\xA0\x9F\x9EL\x00\x00:\x00\x9D\x00=\x005\x00\x84\x00\x9C\x00<\x00/\x00A\x00\x05\x00" 400 173 "-" "-"
不难看出 HTTPS 没有解密,但是为什么会这样呢?
更尴尬的是如果我将反向代理 ELB 调成单服务器,没有负载均衡,就不会有这个问题了,通过 HTTPS 访问也一切正常。
很奇怪的问题,求大神解答,毕竟最终还是想要用负载均衡。
一些 log 和设置:
Dockerrun.aws.json
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "{{亚马逊 ECR 保管库}}",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "80"
}
],
"Logging": "/var/log/nginx"
}
负载均衡时的 Nginx Log:
172.31.43.168 - - [09/Dec/2017:17:46:30 +0000] "\x16\x03\x01\x00\x8F\x01\x00\x00\x8B\x03\x03qkJ\xC8u\xC1\xB48\xF2\xABA\x95\xC6!\xB3\xC7\xB8,\x92\xF6@\x10s\xEE\x9C\xED\xAB-\xA0\x9F\x9EL\x00\x00:\x00\x9D\x00=\x005\x00\x84\x00\x9C\x00<\x00/\x00A\x00\x05\x00" 400 173 "-" "-"
单服务器时的 Log:
141.101.107.147 - - [09/Dec/2017:19:10:57 +0000] "GET /docs/vendor/lodash.custom.min.js?v=1512846657862 HTTP/1.1" 200 19579 "https://api.wolfbeacon.com/docs/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36"
162.158.155.17 - - [09/Dec/2017:19:10:57 +0000] "GET /docs/vendor/path-to-regexp/index.js?v=1512846657862 HTTP/1.1" 200 5147 "https://api.wolfbeacon.com/docs/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36"
等等.....