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

时间:2014-08-16 18:07:32

标签: nginx aws-opsworks

使用Opsworks标准设置/配方为通过Unicorn / nginx层提供的Rails应用程序。 SSL在Elastic Load Balancer处终止 - 因此来自ELB的rails应用程序的流量始终为http。到现在为止还挺好。我希望将http://domain.com的任何请求重定向到https://domain.com

ELB有两个侦听器 - 一个是端口80,另一个是443。

我知道如果我运行自己的nginx,我可以设置一个重定向规则......但是,如果可能的话,我希望保持在opsworks的做事方式。

2 个答案:

答案 0 :(得分:2)

我非常确定您必须在应用服务器上使用nginx来处理重定向http - > HTTPS。 以下是解决此问题的两种方法。

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

    server {
       listen 80;
       return 301 https://example.com/$request_uri;
    }
    
  2. 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;
            }  
        }
    }
    

答案 1 :(得分:2)

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

somecookbook /食谱/ 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 /模板/默认/ nginx的/ http_redirect.conf.erb

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