所有请求都发送到第一个(默认)虚拟主机

时间:2016-03-30 09:40:23

标签: apache reverse-proxy virtual-hosts

我们正在尝试apache 2.2.22和tomcat-7之间的反向代理。我的httpd.conf文件中的内容如下:

NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /apps/httpd-2.2.22/docroot/app1/
ServerName app1.mycompany.com
ErrorLog logs/app1.mycompany.com.error_log
CustomLog logs/app1.mycompany.com.access_log common
......
.........
</VirtualHost *.80>

<VirtualHost *:80>
DocumentRoot /apps/httpd-2.2.22/docroot/app2/
ServerName app2.mycompany.com
ErrorLog logs/app2.mycompany.com.error_log
CustomLog logs/app2.mycompany.com.access_log common
....
......
</VirtualHost *.80>

由于我还在等待获取SSL证书,所以现在只想检查HTTP请求。我只是在浏览器中提供IP以检查一切是否正常。

来自浏览器的两个应用程序请求都登陆第一个虚拟主机。

http://1.2.3.4/app1  (Gives me the correct site)

http://1.2.3.4/app2  (Gives me wrong, as docroot it reads is of 1st host)

如果我删除app1虚拟主机条目,则 http://1.2.3.4/app2 可以正常工作。

我们已在旧服务器中运行相同的设置,因此我没有将网址设为 http://app1.mycompany.com/app1 (通过提供服务器名称而不是IP)。一旦我们将服务器设置好并且运行良好,我们就需要更换它。

  1. 当我在浏览器中提供旧服务器的IP时,应用程序正常。为什么它失败了这台服务器?我需要一些额外的设置吗?

  2. ServerName如何映射?

  3. 忘记提及 app1 app2 正在tomcat服务器上运行,例如机器 A ,并且apache web服务器在机器上的即可。我需要为此做一些配置吗?已经在worker.properties中有tomcat服务器详细信息。

2 个答案:

答案 0 :(得分:1)

  

如果您使用的是基于名称的虚拟主机,则部分内的ServerName指定必须在请求的Host:标头中显示哪个主机名才能匹配此虚拟主机。

来源:https://httpd.apache.org/docs/2.4/mod/core.html#servername

您在浏览器中输入的域名将作为名为&#34; Host&#34;的HTTP请求标头发送到服务器。服务器将通过匹配ServerName值和&#34; Host&#34;中存在的值,为每个请求选择正确的虚拟主机配置。 HTTP请求标头。

  

如果在包含最具体匹配的IP地址和端口组合的虚拟主机集中找不到匹配的ServerName或ServerAlias,则将使用与其匹配的第一个列出的虚拟主机

来源:https://httpd.apache.org/docs/2.4/vhosts/name-based.html

目前,服务器正在接收IP&#34; 1.2.3.4&#34;在主机头中,而不是域&#34; app2.mycompany.com&#34;,因此它根据第一个虚拟主机中的配置提供内容。

<强>解决方案: 通过修改本地计算机上的主机文件 来测试新服务器。在hosts文件中添加以下行:

1.2.3.4 app1.mycompany.com
1.2.3.4 app2.mycompany.com

现在在本地计算机的浏览器中输入http://app2.mycompany.com,然后在&#34; app2.mycompany.com&#34;的DNS解析中输入将返回新服务器的IP。因此,仅在本地计算机上,将从新服务器获取内容。对于世界其他地方,仍将从旧服务器获取内容。 hosts文件位于Linux中的/ etc / hosts路径和Windows中的C:\ Windows \ System32 \ drivers \ etc \ hosts下。

答案 1 :(得分:0)

我把它整理好了。在我的windows host.ini文件中提供主机名条目,然后就可以访问这些应用程序了。 IT团队确认他们会将DNS条目放在Linux服务器(具有Apache)中,并且它将起作用。 Nidhi正在使用Apache mod_jk连接器。谢谢!