我们有一个公共AWS ELB正在重定向流量,如下所示:
HTTP 80 HTTP 9001
TCP 443 TCP 9001
目标实例是运行带有nginx容器的docker的AWS ECS实例。
Docker转发9001 - > 8080,nginx正在收听8080。 这是一个剪辑nginx配置:
server {
ssl on;
ssl_certificate /etc/nginx/mydomain.crt;
ssl_certificate_key /etc/nginx/mydomain.key;
listen 8080;
server_name %{ROUTER_CLEARCARE_SERVER_NAME};
access_log /var/log/nginx/access.log logstash_json;
if ($http_x_forwarded_proto != 'https') {
return 301 https://$host$request_uri;
}
set $target_web "web.mydomain.com:80";
location / {
proxy_read_timeout 180;
proxy_connect_timeout 2;
proxy_send_timeout 180;
keepalive_timeout 180;
resolver 10.10.0.2 valid=30s;
proxy_set_header Host $host;
proxy_pass http://$target_web;
proxy_set_header X-Unique-ID $request_id;
}
}
我需要在nginx容器上进行SSL终止,因为我们有多个域的多个证书,并且我们使用具有不同超时的路径路由(ELB仅支持单个证书,并且ALB不支持基于路径的路由超时和证书)。
这是踢球者:nginx只能监听一个端口(我们使用一个名为Empire的工具将nginx容器部署到AWS ECS,他们目前只支持这种配置)。
nginx可以在单个端口上支持http和https吗?
目前,使用该配置,我在尝试点击http://example.com时收到此错误:
The plain HTTP request was sent to HTTPS port
当我尝试点击https://example.com时出现此错误我收到此错误:
mydomain.com redirected you too many times.
答案 0 :(得分:1)
我发现一条声明,this serverfault page (check out 2nd answer from Komu)上的NginX应该可以监听HTTP和HTTPS。我在下面重复一遍,所以你可以更容易地找到它。你能试试吗?如果您不受NginX的约束,您可能会对this node.js plugin感兴趣,它也允许在同一端口上侦听HTTP和HTTPS。
引自here:
根据维基百科关于状态代码的文章,Nginx有一个自定义 将http流量发送到https端口时出现错误代码(错误代码497)
根据error_page上的nginx文档,您可以定义一个URI 将显示特定错误。因此,我们可以创建一个uri 当引发错误代码497时,将发送客户端。
#lets assume your IP address is 89.89.89.89 and also that you want nginx to listen on port 7000 and your app is running on port 3000 server { listen 7000 ssl; ssl_certificate /path/to/ssl_certificate.cer; ssl_certificate_key /path/to/ssl_certificate_key.key; ssl_client_certificate /path/to/ssl_client_certificate.cer; error_page 497 301 =307 https://89.89.89.89:7000$request_uri; location / { proxy_pass http://89.89.89.89:3000/; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Protocol $scheme; } }
但是,如果客户通过除GET之外的任何其他方法发出请求, 该请求将变为GET。从而保留了请求 客户进来的方法;我们使用错误处理重定向 如error_page上的nginx文档所示
这就是为什么我们使用301 = 307重定向。
使用此处显示的nginx.conf文件,我们可以使用http和 https在同一个端口上收听