我需要为多台服务器设置 Apache 代理,每台服务器一个代理。我可以通过两种方式完成此操作:
设置一个虚拟主机和多个代理。每个服务器都作为虚拟主机的一个子目录: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>
设置 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>