使用 opsworks nginx 和 ELB 终止 SSL 时强制使用 HTTPS

Posted

技术标签:

【中文标题】使用 opsworks nginx 和 ELB 终止 SSL 时强制使用 HTTPS【英文标题】:Forcing HTTPS when using opsworks nginx and ELB to terminate SSL 【发布时间】:2014-10-10 03:17:15 【问题描述】:

对通过 Unicorn/nginx 层提供服务的 Rails 应用程序使用 Opsworks 标准设置/配方。 SSL 在 Elastic Load Balancer 处终止 - 因此从 ELB 到 rails 应用程序的流量始终是 http。到目前为止,一切都很好。我想有任何请求 http://domain.com 被重定向到 https://domain.com

ELB 有两个侦听器 - 一个使用端口 80,一个使用 443。

我知道,如果我运行自己的 nginx,我可以设置重定向规则......但是,如果可能,我想留在 opsworks 的做事方式中。

【问题讨论】:

你有没有找到任何帮助你解决这个问题的东西? Opsworks 的做法是什么?我按照他们的文档进行操作,但 ELB 仍然在浏览器中终止/杀死/抛出错误,但我可以输入 IP 地址,它将通过。 我最终把它保持得非常简单,并在发生从 http 到 https 的重定向的地方使用了 CloudFlare。所以ELB保持在https上,根本不需要打开http端口。 【参考方案1】:

我很确定你必须在你的应用服务器上使用 nginx 来处理重定向 http -> https。 这里有两种方法可以解决这个问题。

    将所有请求从 80 重定向到 https:

    server 
       listen 80;
       return 301 https://example.com/$request_uri;
    
    

    ELB 支持名为 X-FORWARDED-PROTO 的标头。 通过 ELB 的所有 HTTPS 请求都将具有 X-FORWARDED-PROTO = “HTTPS” 的值:

    server 
        listen 80;
        location / 
            if ($http_x_forwarded_proto != 'https') 
                rewrite ^ https://$host$request_uri? permanent;
              
        
    
    

【讨论】:

【参考方案2】:

我认为在 OpsWorks 中执行此操作的唯一方法是创建一个修改 /etc/nginx/sites-available/#application 的自定义配方。在您的自定义食谱中:

somecookbook/recipes/nginx.rb

node[:deploy].each do |application, deploy| 

      service "nginx" do
        supports :status => true
        action :nothing
      end

      # Add HTTP => HTTPS redirect      
      template "/tmp/http_redirect.conf" do
        source "nginx/http_redirect.conf.erb"
      end

      execute "redirect HTTP to HTTPS" do
        cwd "/etc/nginx/sites-available"
        command "cat #application /tmp/http_redirect.conf > /tmp/#application.conf && cat /tmp/#application.conf > #application"
        notifies :restart, "service[nginx]", :immediately
      end                                      
  end    
end

然后在配置中:

somecookbook/templates/default/nginx/http_redirect.conf.erb

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

【讨论】:

非常感谢!只是一个错字,应该是 http_redirect.conf.erb 模板文件扩展名的“.erb”

以上是关于使用 opsworks nginx 和 ELB 终止 SSL 时强制使用 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS(ELB、Kubernetes Nginx 和 ACM)配置 HSTS

如何为 WebSocket 协议配置 AWS ELB 和 Nginx? [关闭]

我可以使用/覆盖 AWS OpsWork 的内置 unicorn::rails 配方安装自定义构建的 nginx 吗?

ini 使用nginx代理AWS ELB

使用 Nginx/Tomcat 的 EC2/ELB 运行状况检查失败

直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有啥缺点?