NGINX 反向代理多个自定义 SSL 端口

NGINX 反向代理多个自定义 SSL 端口

编辑:经过评论、更多阅读和与优秀同事的几轮讨论,我们得出结论,只要我们无法控制后端服务器,就无法使用自定义 SSL 端口,因为我们无法指示后端来促进它。我仍然会把问题留在这里,因为它可能会帮助其他人在未来得出同样的结论,而不会浪费数小时的研究。而且有人可能会证明我们错了,这种可能性很小。

我们有一个聊天服务器,客户可以直接连接到我们的 CS 代表。我们在不同的域上有几个网站,从这些网站提供 iframe 聊天框,因此由于跨站点脚本问题,我们需要在反向代理上提供几个不同的 SSL 证书。为了解决这个问题,而无需为每个域设置一个 NGINX 反向代理(有很多),我们希望在一个 NGINX 上的自定义端口上为所有域提供服务,因此它看起来像这样:

chat.domainA.com:443 -> chat_server:80

chat.domainB.com:2001->chat_server:80

chat.domainC.com:2002->聊天服务器:80

这是我尝试设置 NGINX 反向代理的方法:

server {
    listen 443 ssl;
    server_name chat.domainA.com;

    access_log /var/log/nginx/ssl-access.log;
    error_log /var/log/nginx/ssl-error.log;

    ssl_certificate /etc/nginx/ssl/chat.domainAbundle.com.crt.pem; # Cert chain
    ssl_certificate_key /etc/nginx/ssl/chat.domainA.com.key.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    [...]
    SSL Specific information, ciphers, etc
    [...]

    location / {
        proxy_pass http://internal_chat_server/;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
server {
    listen 2001 ssl;
    server_name chat.domainB.com;

    access_log /var/log/nginx/ssl-access.log;
    error_log /var/log/nginx/ssl-error.log;

    ssl_certificate /etc/nginx/ssl/chat.domainBbundle.com.crt.pem; # Cert chain
    ssl_certificate_key /etc/nginx/ssl/chat.domainB.com.key.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    [...]
    SSL Specific information, ciphers, etc
    [...]

    location / {
        proxy_pass http://internal_chat_server/;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
server {
    listen 2002 ssl;
    server_name chat.domainC.com;

    access_log /var/log/nginx/ssl-access.log;
    error_log /var/log/nginx/ssl-error.log;

    ssl_certificate /etc/nginx/ssl/chat.domainCbundle.com.crt.pem; # Cert chain
    ssl_certificate_key /etc/nginx/ssl/chat.domainC.com.key.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    [...]
    SSL Specific information, ciphers, etc
    [...]

    location / {
        proxy_pass http://internal_chat_server/;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

我们遇到的问题是,如果我们访问例如https://chat.domainB.com:2001然后我们被重定向回https://chat.domainB.com(在端口 443 上),显然我们会收到证书错误,因为它是chat.domainA.com的证书监听该端口。连接到https://chat.domainA.com工作正常。

我们尝试了多种解决方案来强制反向代理服务器保留端口号,但无论我们尝试什么,它仍然会恢复到端口 443。

我们尝试过重写和子文件夹、重定向(这会导致循环),proxy_set_header 主机 $host:$server_port等等,但都无济于事。请不要将上述配置视为我们唯一的尝试,这只是“更干净”的代码。

内部聊天服务器是 Cisco 设备,我们无法自行对其进行任何配置,因此需要在反向代理上进行任何配置。我们真的必须为每个域设置一个反向代理吗?还是我们忽略了什么?

非常感谢您的帮助。

相关内容