如何使用Elastic Load Balancer在Amazon EC2上设置HTTPS

时间:2017-02-11 08:33:35

标签: amazon-web-services ssl nginx amazon-ec2 ssl-certificate

我已在亚马逊证书管理器中申请了证书。现在它的状态为“已发布”。 在EC2控制台中,我创建了Load Balancer。有2个监听器:HTTP和HTTPS。我尝试了Application Load Balancer和Classic Load Balancer,但我无法通过HTTPS连接到我的网站。

我的nginx配置:

server {
    listen 80;
    #listen 443 ssl;

    rewrite ^(.*) https://$host$1 permanent; 

    server_name site.com www.site.com;
    root /home/ubuntu/www/site.com/wordpress;
    index index.php;

    client_max_body_size 20m;
    gzip on;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;


    location ~* ^/(\.htaccess|xmlrpc\.php)$ {
        return 404;
    }

    location ~ /\. {
            deny all;
    }

    location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
    }

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
            access_log off;
            log_not_found off;
            expires max;
    }

    location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;

        set $is_https 'off';
            if ($http_x_forwarded_proto ~ 'https') {
                set $is_https 'on';
            }
        proxy_set_header HTTPS $is_https;

        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://app_server;
            break;
     }
            #try_files $uri $uri/ /index.php?$args; # permalinks
    }

    location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }

}

如何手动导入证书?或者有一种方法可以使用Amazon证书设置HTTPS连接吗?

Godaddy domain DNS settings

2 个答案:

答案 0 :(得分:1)

如果您有ACM证书,只需从ELB Listener for HTTPS / 443中选择该证书,您就不需要在nginx实例中设置SSL配置了。只需让它在端口80上响应。

您只需要在实例的ELB到HTTP端口80中同时使用HTTP / 80和HTTPS / 443(此示例使用的是经典ELB)

enter image description here

如果证书是在ACM中,您应该在SSL证书下选择“更改”时在下拉列表中看到它。

现在您只需要确保您的ELB安全组设置为允许来自80/443的Ingress和来自80的Egress。您需要确保您的实例允许来自ELB安全组的Ingress。

答案 1 :(得分:0)

根据您的ELB设置和端口映射,当您的实例位于AWS ELB后面时,$https变量将不会始终有效(h / t @Michael - sqlbot)。您应该使用HTTP_X_FORWARDED_PROTO标头,并在检查HTTP_X_FORWARDED_PROTO标头的 IF 语句中移动重写规则:

location / {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;

  if ($http_x_forwarded_proto != "https") {
    rewrite ^(.*)$ https://$server_name$1 permanent;
  }

  .
  .
  .
}

关于安全组的说明

此外,您需要确保负载均衡器可以与侦听器端口和运行状况检查端口上的已注册目标进行通信。欲了解更多信息:

Security Groups for Your Application Load Balancer

Security Groups for Your Classic Load Balancer