(已更新)我想代理这样的请求:
https://port123.host.com:85/any/path ==> http://server85:123/any/path
https://port567.host.com:85/any/path ==> http://server85:567/any/path
https://port123.host.com:86/any/path ==> http://server86:123/any/path
https://port567.host.com:86/any/path ==> http://server86:567/any/path
你建议我如何实现这个目标?(我知道这是一个有趣的架构)
服务器声明在没有 SSL 的情况下也可以工作,但是有了 SSL 则不行。
server {
listen 86 ssl;
server_name port123;
ssl_certificate CERT123;
ssl_...;
localtion / { proxy_pass.... }
}
server {
listen 86 ssl;
server_name port567;
ssl_certificate CERT567;
ssl...;
localtion / { proxy_pass.... }
}
我知道这是 nginx 的一个已知限制(单个端口和单个 IP 上的多个 SSLS)。但我想知道是否有任何简单的解决方法。我无法使用 SAN,因为我拥有的每台服务器实际上都是带有通配符证书的通配符。
答案1
您可以为希望 nginx 监听的每个端口创建一个服务器块。在服务器块中,您可以重定向到主机:端口组合。试试这个……它应该会按照您的要求执行:
server {
listen 85;
listen [::]:85;
server_name port123.host.com;
location / {
proxy_pass http://server85:123/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 86;
listen [::]:86;
server_name port567.host.com
location / {
proxy_pass http://server86:567/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
答案2
我最终为每个 SSL 端点设置了单独的 IP 地址。由于 TLS 会话在没有主机头的情况下进行,因此 nginx 无法“猜测”要使用哪个证书。因此 IP 修复了这个问题,而且我碰巧有一些可用的 IP。所以:
server {
listen 192.168.1.5:85 ssl;
server_name port123;
ssl_certificate /port123.crt;
ssl_certificate_key /port123.key;
location / {
proxy_pass http://server85:123/;
}
}
server {
listen 192.168.1.6:86 ssl;
server_name port123;
ssl_certificate /port567.crt;
ssl_certificate_key /port567.key;
location / {
proxy_pass http://server86:567/;
}
}
我实际上有更多组合,并且还设置了不同的标题。但它最终起作用了。
与往常一样,nginx 有最好的文章:http://nginx.org/en/docs/http/configuring_https_servers.html