多服务器的 Apache 代理:两种解决方案的比较

多服务器的 Apache 代理:两种解决方案的比较

我需要为多台服务器设置 Apache 代理,每台服务器一个代理。我可以通过两种方式完成此操作:

  1. 设置一个虚拟主机和多个代理。每个服务器都作为虚拟主机的一个子目录:aaa.bbb.ccc/test1 和 aaa.bbb.ccc/test2

    <VirtualHost *:443>
        ServerName aaa.bbb.ccc
        RewriteEngine on
        RewriteRule ^/test1$ /test1/ [R]
        RewriteRule ^/test1(.*) http://localhost:8080$1 [P]          
        RewriteRule ^/test2$ /test2/ [R]
        RewriteRule ^/test2(.*) http://localhost:8081$1 [P]
        <Location "/test1">
            ...
        </Location>
        <Location "/test2">
            ...
        </Location>
        ....
    </VirtualHost>
    
  2. 设置 N 个虚拟主机和 N 个代理,为 N 个服务器提供服务。每个服务器将由一个虚拟主机提供服务。

    NameVirtualHost *:443
    <VirtualHost *.443>
        ServerName aaa.bbb.ccc
        RewriteEngine on
        RewriteRule ^(.*) http://localhost:8080$1 [P]
        <Location "/">
            ...
        </Location>
    </VirtualHost>
    <VirtualHost *.443>
        ServerName ddd.bbb.ccc
        RewriteEngine on
        RewriteRule ^(.*) http://localhost:8081$1 [P]
        <Location "/">
            ...
        </Location>
    </VirtualHost>
    

两种方法都有效。但我不知道哪种方法更好。有人能比较一下这两种方法的优缺点吗?

答案1

这两种方式通常都没有错。但两者之间真正的巨大差异在于证书管理。选项 1 只需要 1 个 SSL 证书。选项 2 取决于您对主机名的处理方式。如果唯一改变的是子域,则可以使用通配符证书,或者您需要为每个虚拟主机都准备一个证书。这两种方式都可能很昂贵。

一般来说,这两个选项之间最大的真正驱动力是“业务”类型的决策。在内部服务器之间进行更清晰的分离。

实际上,将内部服务器暴露给外部的方式并不是最有效的。从技术上讲,这是可行的,但你可能会遇到很多问题。页面上的链接可能会呈现错误。在外部网站上,你实际上会暴露内部链接,并让网站看起来已经损坏。图像和 Javascript 也无法正常运行或执行一些奇怪的操作。你真的应该使用 Proxy 和 ReverseProxy

ProxyRequests off
ProxyPass /test1/ http://127.0.0.1:8080/
ProxyPass /test2/ http://127.0.0.1:8081/
ProxyHTMLURLMap http://127.0.0.1:8080 /app1
ProxyHTMLURLMap http://127.0.0.1:8081 /app2

<Location /test1/>
        ProxyPassReverse /
        ProxyHTMLEnable On
        ProxyHTMLURLMap  /      /test1/
</Location>

<Location /test2/>
        ProxyPassReverse /
        ProxyHTMLEnable On
        ProxyHTMLURLMap /       /test2/
</Location>

相关内容