Amazon web services 如何使用弹性负载平衡器在Amazon EC2上设置HTTPS

Amazon web services 如何使用弹性负载平衡器在Amazon EC2上设置HTTPS,amazon-web-services,ssl,nginx,amazon-ec2,ssl-certificate,Amazon Web Services,Ssl,Nginx,Amazon Ec2,Ssl Certificate,我已在Amazon证书管理器中请求证书。现在它的状态为“已发布”。 在EC2控制台中,我创建了负载平衡器。有两个侦听器:HTTP和HTTPS。我尝试了应用程序负载平衡器和经典负载平衡器,但我无法通过HTTPS连接到我的站点 我的nginx配置: server { listen 80; #listen 443 ssl; rewrite ^(.*) https://$host$1 permanent; server_name site.com www.site.

我已在Amazon证书管理器中请求证书。现在它的状态为“已发布”。 在EC2控制台中,我创建了负载平衡器。有两个侦听器:HTTP和HTTPS。我尝试了应用程序负载平衡器和经典负载平衡器,但我无法通过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连接


根据ELB设置和端口映射,当您的实例位于AWS ELB(h/t@Michael-sqlbot)后面时,
$https
变量并不总是有效。您应该改用
HTTP_X_FORWARDED_PROTO
头,并将重写规则移动到检查
HTTP_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;
  }

  .
  .
  .
}
关于安全组的说明

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


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

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

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


现在您只需要确保您的ELB安全组已设置为允许从80/443进入和从80退出。您需要确保您的实例允许从ELB安全组进入。

您是否将证书设置为ELB?医生来了:@minamijoyo是的,我来了。是否需要配置后端实例身份验证(可选)?否,您不需要后端身份验证。nginx访问或错误日志中是否有任何输出?您是在点击负载平衡器还是仍在直接点击服务器?@MarkB您的意思是什么?它将我重定向到https,但不起作用。nginx日志中没有错误。在负载平衡器中,我有监听器:1)HTTP 80-->HTTP 80,2)HTTPS 443-->HTTP 80。在tab实例上的负载平衡器中,它的状态为“OutOfService”。为什么要将HTTPS协议的侦听端口设置为80?HTTPS侦听器应该在端口443上侦听。@KhalidT。“HTTPS在AWS ELB之后不会起作用”在这种情况下是合适的建议,但作为参考,@Michael sqlbot:你完全正确:)我已经更新了我的答案。谢谢。是的,我做到了。但正如@MarkB所说,我应该配置我的dns设置以使用ELB。如果不使用Route53,我如何执行此操作?在我的Godaddy帐户中,我有一个名为“@”且值为“EC2 ip”的A记录。在ELB描述中,您将看到一个DNS记录。试着直接击中它,它应该会起作用。然后在GoDaddy中使用/创建一个指向ELB DNS的CNAME记录。我已经更新了我的帖子。请查看我的域配置。HTTPS仍然不起作用。当我尝试通过ELB DNS名称直接打开url时,它会将我重定向到并显示错误“您的连接不是私有的”,因为它的安全证书来自*.mydomain。com@Alex巴甫洛夫-您应该首先确认ELB工作正常。在此之前不要担心DNS配置。在ELB实例选项卡中,确认您的实例为“正在使用”。如果没有,ELB将不允许任何车辆通过。一旦你有了工作,然后直接点击ELB DNS(在描述选项卡中找到)。如果有效,则可以开始配置外部DNS。