【发布时间】:2017-05-30 05:04:57
【问题描述】:
我目前正在 AWS ElasticBeanstalk 中使用 single container docker environment 部署 Django + uWSGI 应用程序。这个环境已经随 nginx 一起提供了,我目前正在尝试配置它。
我正在努力实现以下目标:
- 在环境的负载平衡器处终止 HTTPS
- 使用 nginx(环境自带)将 HTTP 请求重定向到 HTTPS
- 将请求从 nginx 传递到 uwsgi
环境信息:
- 配置和解决方案堆栈名称:单容器 Docker 1.11 2.3.0 版
- AMI:运行 Docker 的 64 位 Amazon Linux 2016.09 v2.3.0 1.11.2 2016.09.0
- Docker 版本:1.11.2
- 代理服务器:nginx 1.10.1
这是我当前的配置:
.ebxtensions/00-loadbalancer-terminatehttps.config
option_settings:
aws:elb:listener:443:
ListenerEnabled: true
ListenerProtocol: HTTPS
SSLCertificateId: <resource-id-here>
InstancePort: 443
InstanceProtocol: HTTP
aws:elb:listener:80:
ListenerEnabled: true
ListenerProtocol: HTTP
InstancePort: 80
InstanceProtocol: HTTP
.ebextensions/01-nginx-proxy.config
files:
"/etc/nginx/sites-available/test.domain.com.conf":
mode: "000644"
owner: root
group: root
content: |
server {
listen 80;
server_name test.domain.com;
access_log /var/log/nginx/$server_name.access.log;
location / {
return 301 https://$server_name$request_uri;
}
location = /status/ {
access_log /var/log/nginx/$server_name.healthd.log healthd;
include uwsgi_params;
uwsgi_pass docker;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
}
}
server {
listen 443;
server_name test.domain.com;
access_log /var/log/nginx/$server_name.access.log;
location / {
include uwsgi_params;
uwsgi_pass docker;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
client_max_body_size 100m;
}
location /static {
alias /var/www/static;
}
}
commands:
00_enable_site:
command: 'rm -f /etc/nginx/sites-enabled/* && ln -s /etc/nginx/sites-available/test.domain.com.conf /etc/nginx/sites-enabled/test.domain.com.conf'
.ebextensions/02-healthcheckurl.config
option_settings:
- namespace: aws:elasticbeanstalk:application
option_name: Application Healthcheck URL
value: /status/
application.ini(uwsgi 配置)
[uwsgi]
master = true
socket = :3031
processes = 4
enable-threads = true
threads = 2
chdir = /opt/app/
wsgi-file = test/wsgi.py
logto2 = /var/log/uwsgi.log
callable = application
py-autoreload = 3
现在,在测试配置时:
检查http://test.domain.com/status/ 工作正常
$ wget http://test.domain.com/status/
--2017-01-14 23:00:18-- http://test.domain.com/status/
Resolving test.domain.com... 52.xx.xx.xx, 52.xx.xx.xy
Connecting to test.domain.com|52.xx.xx.xx|:80... connected.
HTTP request sent, awaiting response... 200 OK
检查http://test.domain.com/hello/ 没有按预期工作。它重定向正常,但它会挂起直到请求超时。
$ wget http://test.domain.com/hello/
--2017-01-14 22:59:13-- http://test.domain.com/hello/
Resolving test.domain.com... 52.xx.xx.xx, 52.xx.xx.xy
Connecting to test.domain.com|52.xx.xx.xx|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://test.domain.com/hello/ [following]
--2017-01-14 22:59:15-- https://test.domain.com/hello/
Connecting to test.domain.com|52.xx.xx.xx|:443... connected.
HTTP request sent, awaiting response... 408 REQUEST_TIMEOUT
2017-01-14 23:00:17 ERROR 408: REQUEST_TIMEOUT.
【问题讨论】:
-
登录到 Beanstalk 服务创建的 EC2/ECS 机器后,您是否在日志中看到任何错误?
-
/var/log/nginx/error.log 没有显示任何内容。 uwsgi.log 仅显示对 /status/ 的 GET 请求。显然,uwsgi 没有收到来自 nginx 的其他路径(即 /hello/ 和 /)的请求。
-
超时通常暗示安全组不允许某些流量。我对ELB over Elasticbeanstalk不太熟悉,但是“正常”的ELB需要你专门开通443流量。
-
@deviavir 就是这样!在安全组中,我必须启用从负载均衡器到端口 443 的入站流量。
-
@blaze 啊 :) 这比我想象的要容易!我添加了一个“答案”,可以让你有一个更简单的 nginx 配置,也可以解决问题(它可以让你在实例上重用相同的端口 80)。
标签: amazon-web-services nginx docker amazon-elastic-beanstalk uwsgi