16

サブドメインに応じて異なるバックエンドにトラフィックを転送する SSL プロキシとして Nginx を使用する必要があります。

複数の「server {」セクションを定義する必要があるように思われますが、SSL では正しく機能しません。これを行うと、https トラフィックを処理するまでサーバー名が不明であるため、最初の仮想ホストで常に SSL が処理されます。

シナリオ:

  • 1 つの IP アドレス
  • 1 つの SSL ワイルドカード ワイルドカード
  • 次のようにアクセスする必要がある複数のバックエンド:

    https://one.mysite.com/ -> http://localhost:8080
    https://two.mysite.com/ -> http://localhost:8090
    

Nginx は「if」は悪だと言っています: http://wiki.nginx.org/IfIsEvilですが、他に何ができますか?

これを試しましたが、うまくいきません。500 エラーが発生しますが、エラー ログには何も記録されません。

    server {
    listen 443;
    server_name *.mysite.com;

    ssl on;
    ssl_certificate ssl/mysite.com.crt;
    ssl_certificate_key ssl/mysite.com.key;

    location / {
        if ($server_name ~ "one.mysite.com") {
            proxy_pass http://localhost:8080;
        }
        if ($server_name ~ "two.mysite.com") {
            proxy_pass http://localhost:8090;
        }
    }

Nginxでこれを達成した人はいますか? ヘルプ/代替案、リンクは大歓迎です。

4

3 に答える 3

28

基本的に「サーバー」ブロックの外側でSSLオプションとSSL証明書を定義するソリューションを見つけました:

ssl_certificate ssl/mysite.com.crt;
ssl_certificate_key ssl/mysite.com.key;
ssl_session_timeout  5m;
ssl_protocols        SSLv3 TLSv1;
ssl_ciphers          ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+EXP;
ssl_prefer_server_ciphers   on;

server {
    listen 80;
    server_name *.mysite.com;
    rewrite ^ https://$host$request_uri? permanent;
}
server {
    listen 443 ssl;
    server_name one.mysite.com;

    ssl on;

    location / {
        proxy_pass http://localhost:8080;
    }
}
server {
    listen 443 ssl;
    server_name two.mysite.com;

    ssl on;

    location / {
        proxy_pass http://localhost:8090;
    }
}

重要事項:

  • 「ssl オン;」httpsをリッスンする「サーバー」ブロック内にある必要があるのはこれだけです。外部に配置することもできますが、ポート80でリッスンする「サーバー」ブロックが期待されるhttpではなくhttpsプロトコルを使用するようにするにはどうすればよいですか。
  • 「ssl_certificate」、「ssl_ciphers: およびその他の「ssl_*」は「server」ブロックの外側にあるため、Nginx は server_name なしで SSL オフロードを実行します。ホスト名に基づいて SSL 復号化を行うことはできないため、これを実行する必要があります。この段階では URL が暗号化されているためです。
  • JAVA と curl が動作するようになりました。server_name - ホスト ミスマッチはありません。
于 2013-08-20T14:44:09.813 に答える
4

簡単な答えは、Server Name Indicationを使用することです。これは、一般的なブラウザーと cURL でデフォルトで機能するはずです。

于 2013-08-20T16:13:24.837 に答える