我正在尝试设置两个子域,fora
和b
in domain.com
。我使用了两个 .conf 文件,根据对 ServerName 和 ProxyPass 的更改,它们看起来几乎相同:
<VirtualHost *:80>
ServerName a.domain.com #This was added as a try for a fix.
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/a
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
ProxyPass / https://a.domain.com:8444/
ProxyPassReverse / https://a.domain.com:8444/
ProxyPass /a/ https://a.domain.com:8444/
ProxyPassReverse /a/ https://a.domain.com:8444/
ProxyPass /b/ https://b.domain.com:8445/
ProxyPassReverse /b/ https://b.domain.com:8445/
</VirtualHost>
这是在我的测试环境中完成的,复制类似于当前生产的东西。在 /etc/hosts 中,我将a.domain.com
和添加b.domain.com
到 127.0.0.1。生产中的 DNS 记录了 whata.domain.com
和b.domain.com
are,这是相同的 IP(我也在我正在测试它的机器上做了这个)。
另请注意,我没有从他们的根目录中提供任何内容。我补充说,试图解决标题中所述的问题。不过,两个目录中都有一个简单的 html。
实际问题是什么?
简单地说,在尝试时a.domain.com
,结果是来自 的 webapp localhost:8444
,正如预期的那样。尝试b.domain.com
的时候,结果也是localhost:8444
,而不是localhost:8445
。a.conf
和都已b.conf
启用,如果我禁用a.conf
,那么我正确地得到localhost:8445
. 如果我也尝试喜欢a.domain.com/b
,重定向会解析回a.domain.com
.
我已经阅读了几个问题和教程,其中大多数要么在我的配置中工作,要么添加 NameVirtualHost,我知道我的 Apache 版本不需要。我还在端口 80 中添加了一个 ServerName,因为我认为请求可能b
被匹配,a.conf
因为它们是相同的 IP,但这也不起作用。
我在这里想念什么?我似乎忽略了 mod_proxy 吗?如果可能的话,我想为每个 webapp 保留一个文件。谢谢!
这是在 Ubuntu 18.04.2、Apache 2.4(mod_proxy 和 mod_ssl)、Tomcat 9 上。您想要的任何其他信息,我会尽力提供。
更新
也试过这个配置。同样不受欢迎的结果。
<VirtualHost *:80>
ServerAlias a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
更新
好的,我刚刚发现了一些非常烦人的事情。如果我使用浏览器输入a.domain.com
或b.domain.com
,它们都解析为a.domain.com
。这就是我最初描述的问题。但如果尝试https://a.domain.com
或https://b.domain.com
,都解析到正确的服务器:a
to8444
和b
to 8445
。
因为这非常令人沮丧,所以我会在一段时间内停下来分析一下。
更新
经过长时间的刹车后,我尝试了一些其他的随机调整,只是为了看看发生了什么,但除了使用 HTTPS 时,再次没有按预期工作。我安装了 Postman 以查看请求中发送的内容,并发现在 Postman 中,HTTP 和 HTTPS 都正确使用了主机。更好/更糟:实际响应显示 和 的不同欢迎页面a.domain.com
,b.domain.com
这意味着当我使用 Postman 时,我的配置工作正常。
我认为所有这些考验可能只是缓存问题,但我选择的测试浏览器(Firefox 开发版)设置为不缓存内容。我将使用 curl 和其他浏览器检查响应。
罪魁祸首:缓存。
在某些时候,我的浏览器的配置发生了变化(也许是更新?)并且我拥有超过 3GB 的缓存,包括我试图设置为子域的测试站点。哎呀。
清除缓存后,在访问我的 URL 时提示有关我的自签名证书的警报,正如预期的那样。接受风险后,我被重定向到正确的站点。这是通过使用
b.domain.com
而不添加协议。为了确保这能正常工作,我在所有其他 7 个浏览器中进行了测试(一定要确保),并在使用和不使用协议的情况下进行 curl,结果也是预期的。
最后配置没问题。如果您需要通过子域代理到特定 Tomcat 实例的 Apache 服务器,我将在此处发布它,使用 proxy_mod 也会立即从端口 80 重定向到端口 433 。
请注意 SSL 代理和 SSL 的设置是针对自签名证书的。如果您为生产环境实施此操作,请阅读每个文档的相关文档。另请注意,这是
a.domain.com
. for 的等价物b.domain.com
完全相同,具有适当的 ServerName、ServerAlias、redirects、Location 和 localhost 端口。