15

Rails 4ベータ版のウェブサイトを持っています。Nginx + Unicorn で動作しています。nginx でリクエスト プロトコル ( 'http' または 'https' ) を unicorn に転送して、Unicorn と連携できるようにします。しかし、私はそれを機能させることができません。

テスト用にビューファイルに<%= request.ssl? %>andを入れました。<%= request.protocol %>私のnginxサーバー構成ファイルは次のとおりです。

upstream unicorn {
  server unix:/tmp/unicorn.blog.sock fail_timeout=0;
}

server {
  listen 80;
  listen 443;
  server_name example.com;
  root /home/example;

  ssl on;
  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-Proto https;  # <--- Line 1
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Ssl on;       # <--- Line 2
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

マークした 2 行が正しく動作していないことがわかりました。ここに私のテスト結果があります:

=================

行 1 がコメントアウトされ、行 2 もコメントアウトされました。

http ://the.url にアクセスしてください

<%= request.ssl? %>     : false
<%= request.protocol %> : http

https://the.url にアクセスしてください

<%= request.ssl? %>     : false
<%= request.protocol %> : http

=================

行 1 はコメント アウトされています。行 2 は OR ではありません。行 2 はコメント アウトされています。行 1 は OR ではありません。

http ://the.url にアクセスしてください

<%= request.ssl? %>     : true
<%= request.protocol %> : https

https://the.url にアクセスしてください

<%= request.ssl? %>     : true
<%= request.protocol %> : https

=================

つまり、これらの 2 つの行のいずれかが表示された場合、実際のプロトコルが何であれ、nginx は "https" をアップストリームに転送します。しかし、これらの 2 行のいずれも表示されない場合、実際のプロトコルが何であれ、nginx は「http」をアップストリームに転送します。

プロトコルを正しく転送できるようにnginx構成ファイルを作成する方法を教えてください。どうもありがとうございました。

4

2 に答える 2

38

試す:

proxy_set_header X-Forwarded-Proto $scheme;

また

server {
    Listen 80
    ...
}
server {
    Listen 443
    ...
    location @unicorn {
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Ssl on;
    }
}
于 2013-04-25T19:59:37.970 に答える
1

2 つの個別のサーバー ブロックを構成する必要があります。1 つは HTTP 用、もう 1 つは HTTPS 用です。これにより、2 つの設定が非常に簡単になります。同一のパーツは、別の共有構成ファイルから含めることができます。

于 2013-04-25T19:57:15.350 に答える