我正在尝试将具有多个 Web 服务器的旧基础设施转换为具有单个公共 IP 地址的虚拟化环境。
所有服务器的流量都相对较低,因此性能不是问题。
我目前已在防火墙/堡垒主机上直接安装了 nginx,以反向代理到一些服务器(目前为三台)。
我已使用纯 HTTP 完成了所有工作。
我当前的 HTTP 配置是(简化):
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name mydom.com www.mydom.com;
location / {
proxy_pass http://192.168.99.20:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name redmine.mydom.com git.mydom.com;
location / {
proxy_pass http://192.168.99.30:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name mail.mydom.com email.mydom.com webmail.mydom.com;
location / {
proxy_pass http://192.168.99.10:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
问题是:我应该如何配置 nginx 来转发 HTTPS/SSL?
我尝试了一些类似的事情:
server {
listen 443 ssl;
server_name mydom.com www.mydom.com;
location / {
proxy_pass https://192.168.99.20;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
但由于缺少 ssl_... 节,这不起作用。
“真实”(代理)服务器已经有其证书,但 nginx 似乎需要“本地”证书(我不想提供)。
在这种情况下,“最佳实践”是什么?
注意:如上所述,我需要在防火墙(IPFire)上部署反向代理,因此我的选择相当有限;nginx 和 haproxy 受支持,sniproxy 不受支持。
答案1
答案2
即使没有在 nginx 上安装证书,您也可以使用流模块执行此操作。这样,nginx 就充当了 TCP 代理,而您失去了根据 HTTP 内容(标头、cookie 等)采取行动的能力。
您可以从官方文档中了解更多信息:
https://www.nginx.com/resources/admin-guide/tcp-load-balancing/
https://nginx.org/en/docs/stream/ngx_stream_core_module.html
答案3
我不认为 nginx 有能力做到这一点,但我遇到了sniproxy它似乎被设计用来通过启动 SNI 握手来识别所需的主机名,然后将其传递给正确的服务器,而不需要实际的密钥或证书。
由于它需要 SNI,因此从 XP 上的 IE 和其他不支持它的旧客户端与它的连接将会失败。