我的设置如下:
Linux 服务器(OpenVZ)具有内部 IP 10.10.0.4 - 容器(10.10.0.5) - 容器(10.10.0.6)
由于 IP 空间有限,我只有一个公共 IP 映射到主服务器。4 因此
网络端192.168.1.2 => 10.10.0.4。
现在在主主机 .4 上我运行着 apache 接受端口 80 上的连接等等。使用 mod_proxy 可以拥有如下虚拟主机:
<VirtualHost 10.10.0.4:80 192.168.1.2>
ServerAdmin [email protected]
ServerName host.example.com
ServerAlias ct1.host.example.com
ProxyPass / http://10.10.0.5/
ProxyPassReverse / http://10.10.0.5/
</VirtualHost>
并且有通配符 DNS 设置,以便 *.host.example.com 映射到 192.168.1.2。在容器上,设置了一个标准虚拟主机,如下所示:
<VirtualHost 10.10.0.5:80 *:80>
ServerName ct1.host.example.com
ServerAlias ct1.host.example.com
ServerAdmin [email protected]
DocumentRoot /var/www
<Directory /var/www/>
Options FollowSymLinks
AllowOverride All
</Directory>
Options Indexes FollowSymLinks
ErrorLog /var/logs/error_log
CustomLog /var/logs/access_log common </VirtualHost>
这很好用 - 但是所有使用反向方式查找服务器名称的网站(例如 Joomla 等)都会报告 10.10.0.5,而不是 ct1.host.example.com,而我需要 ct1.host.example.com,因为这需要在本地网络之外工作。当然,我可以破解每个部署的代码,但这并不能解决问题,只是敷衍了事。我不知道为什么这会报告容器的本地 IP 而不是主机名。
我也尝试过以下设置:
/etc/hosts (在 .4 上)
10.10.0.5 ct1.host.example.com
然后在vHost中执行以下操作:
ProxyPass / http://ct1.host.example.com
ProxyPassReverse / http://ct1.host.example.com
但是这并没有产生任何不同。我需要在容器上进行进一步设置吗 - 可能是一些 DNS,或者实际上为这些 IP 创建内部 DNS?
谢谢!
答案1
我想知道您为什么要使用 mod_proxy。基于名称的虚拟主机是否出于某种原因不适合您的用例?
答案2
我的问题的第二部分确实有效 - 尽管由于代码缓存和应用程序的运行方式,它似乎并没有立即起作用。通过在主机文件中创建本地条目(或简单地在主机上设置绑定),我不再需要代理到 IP,而是保留主机名,因此对于在容器上运行的 Apache,就好像我在地址栏中输入了 URL,而不是我之前尝试过的 IP。
我最终在容器创建脚本中添加了一个挂钩,该脚本将 IP 添加到容器主机名的主机文件中,并在 conf.d 目录中创建 Apache 选取的虚拟主机。
感谢那些调查此事的人。