按服务器主机名反向 TCP 代理端口 80 和 443

按服务器主机名反向 TCP 代理端口 80 和 443

我有一个公网 IP 地址。我尝试允许通过公网 IP 的 80 和 443 端口访问多个服务,并通过请求的服务器名称进行区分。

然而,有一项服务需要TCP在公共 IP 上的端口 80 和 443 上使用反向代理才能运行。另一个需要 TCP 反向代理,但只在端口 443 上使用。其余的只是网站,使用 http 反向代理就可以了,但我希望网站在端口 80 和 443 上可以公开访问,以方便访问者和 letsencrypt。

我可以根据需要启动任意数量的 VM 和私有 IP 以使其保持简单,但仅限于一个公共 IP 地址。

我可以使用 SNI 将 nginx 设置为反向代理来执行此操作吗?理论上,我认为我应该能够使用 SNI 通过主机名将所有内容传输到适当的服务器,并使用第二个 Web 服务器(该服务器已设置所需的网站以监听不同的端口)。例如,nginx.conf:

stream {

    map $ssl_preread_server_name $name {
            serviceone.domain.tld serviceone;
            servicetwo.domain.tld servicetwo;
            website1.domain.tld website1;       
            website2.domain.tld website2;   
    }

    upstream serviceone {
            server 10.1.99.7:443;
    }

    upstream servicetwo {
            server 10.1.99.20:443;
    }

    upstream website1 {
            server 10.1.99.30:10443;
    }

    upstream website2 {
            server 10.1.99.30:10444;
    }


    server {
            listen 443;
            listen 80;
            resolver 8.8.8.8;

            proxy_pass $name;
            ssl_preread on;
    }

}

我的 nginx.conf 中有一些与上述类似的功能,但我有点不明白端口 80 请求是如何进入方程的(我只是在服务器块中加入了 listen 80,但无法解释如果请求的是相同的服务器名称,如何区分 443 和 80 来处理请求)

我也愿意尝试使用 nginx 或 haproxy 等更好的方法。谢谢!

答案1

只需对每个主机名使用单独的服务器{...} 块。

它不需要依赖任何附加模块就可以完成工作,并且如果上游服务器在代理上所需的配置不同,它将为您省去很多麻烦。

相关内容