具有多個子域的nginx反向ssl代理

具有多個子域的nginx反向ssl代理

我正在嘗試為我當前的情況找到一個高級配置範例。我們有一個通配符 SSL 證書,用於多個內部 IIS 伺服器上的多個子網域。

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

我希望透過一個伺服器條目處理傳入的 SSL 流量,然後將特定網域傳遞到內部 IIS 應用程式。看來我有兩個選擇:

  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;
}

這似乎是一種方法,但我不確定這是否是最好的方法。我是否缺少一種更簡單的方法?

答案1

我會做這樣的事情(用 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;

答案2

不管你信不信,你可以這樣做:

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;
}

不包含,證書僅加載到內存中一次,並且當用戶從一個子域移動到另一個子域時,會話甚至應該保持緩存,從而節省大量的握手能力。

我找不到除此之外的任何文檔這個伺服器故障帖子來說明為什麼它有效,但我可以向你保證它確實有效。

相關內容