ELB将443/80重定向到nginx docker容器上的单个端口

时间:2016-09-21 14:11:06

标签: nginx amazon-elb

我们有一个公共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.

1 个答案:

答案 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在同一个端口上收听