具有多个子域的 nginx 反向 SSL 代理

具有多个子域的 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

我希望通过一个服务器条目处理传入的 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;
}

无需包含,证书只需加载到内存中一次,并且当用户从一个子域移动到另一个子域时,会话甚至应该保持缓存,从而节省大量的握手马力。

我找不到任何文件此服务器故障帖子来解释为什么这样做有效,但我可以向你保证它确实有效。

相关内容