web-dev-qa-db-ja.com

複数のサブドメインを持つnginxリバースsslプロキシ

現在の状況の高レベルの構成例を見つけようとしています。いくつかの内部IISサーバー上にある複数のサブドメイン用のワイルドカードSSL証明書があります。

site1.example.com (X.X.X.194) -> IISServer01:8081
site2.example.com (X.X.X.194) -> IISServer01:8082
site3.example.com (X.X.X.194) -> IISServer02:8083

1つのサーバーエントリを介して着信SSLトラフィックを処理し、特定のドメインを内部のIISアプリケーションに渡します。2つのオプションがあるようです。

  1. 各サブドメインの場所セクションをコーディングします(私が見つけた例では面倒です)

  2. 暗号化されていないトラフィックを、サブドメインホスト名ごとに異なるサーバーエントリで構成された同じnginxサーバーに転送します。 (少なくともこれはオプションのようです)。

私の最終的な目標は、SSLトラフィックの多くをnginxを通過するように統合して、HAProxyを使用してサーバーの負荷を分散できるようにすることです。

Proxy_set_headerエントリを適切に設定した場合、アプローチ2はnginx内で機能しますか?

私は私の最終的な設定ファイル内でこれに沿って何かを想像します(アプローチ#2を使用):

server {
  listen Y.Y.Y.174:443; #Internally routed IP address
  server_name *.example.com;

  proxy_pass http://Y.Y.Y.174:8081;
}

server {
  listen Y.Y.Y.174:8081;
  server_name site1.example.com;

  -- NORMAL CONFIG ENTRIES --

  proxy_pass http://IISServer01:8081;
}

server {
  listen Y.Y.Y.174:8081;
  server_name site2.example.com;

  -- NORMAL CONFIG ENTRIES --

  proxy_pass http://IISServer01:8082;
}

server {
  listen Y.Y.Y.174:8081;
  server_name site3.example.com;

  -- NORMAL CONFIG ENTRIES --

  proxy_pass http://IISServer02:8083;
}

これは方法のようですが、それが最善の方法かどうかはわかりません。これに対するより簡単なアプローチが欠けていますか?

7
BrianM

私はこのようなことをします(nginx 1.4.2でテストされ、動作するようです):

server {
  listen 127.0.0.1:443 ssl;
  server_name site1.example.com;

  include common.conf;

  location / {
    proxy_pass http://127.0.0.2:8081;
  }
}

server {
  listen 127.0.0.1:443 ssl;
  server_name site2.example.com;

  include common.conf;

  location / {
    proxy_pass http://127.0.0.2:8082;
  }
}

server {
  listen 127.0.0.1:443 ssl;
  server_name site3.example.com;

  include common.conf;

  location / {
    proxy_pass http://127.0.0.3:8083;
  }
}

少なくともこれでcommon.conf

ssl on;
ssl_certificate  /path/to/cert;
ssl_certificate_key  /path/to/key;
10
Changaco

信じられないかもしれませんが、これを行うことができます:

ssl_session_cache shared:SSL:2m;
ssl_session_timeout 5m;

server {
    listen Y.Y.Y.174:443 default_server ssl;
    server_name _;
    ssl_certificate /etc/pki/tls/certs/server.chained.crt;
    ssl_certificate_key /etc/pki/tls/private/server.key;
}

server {
    listen Y.Y.Y.174:443 ssl;
    server_name site1.example.com;
    [...]
    proxy_pass http://IISServer01:8081;
}

server {
    listen Y.Y.Y.174:443 ssl;
    server_name site2.example.com;
    [...]
    proxy_pass http://IISServer01:8082;
}

server {
    listen Y.Y.Y.174:443 ssl;
    server_name site3.example.com;
    [...]
    proxy_pass http://IISServer02:8083;
}

含まれていません。証明書はメモリに1回だけ読み込まれ、ユーザーがサブドメインからサブドメインに移動してもセッションはキャッシュされたままなので、ハンドシェイクの十分な処理能力を節約できます。

これが機能する理由を示唆する this Server Fault post 以外のドキュメントは見つかりませんが、機能することを保証できます。

7
Aaron Adams