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

All requests being send to first(default) virtual host

我们正在 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 可以正常工作。

我们在旧服务器中已经有相同的设置 运行,所以我不给 url 作为 http://app1.mycompany.com/app1(通过给服务器名称而不是 IP)。一旦我们设置好此服务器并且运行很好,我们就需要更换它。

  1. 当我在浏览器中输入旧服务器的 IP 时,应用程序运行良好。为什么这台服务器失败了?我需要一些额外的设置吗?

  2. ServerName是怎么映射的?

忘记提及 app1app2 是 tomcat 服务器上的 运行,它们位于机器上A,Apache Web 服务器在机器 B 上。我需要为此做一些配置吗? tomcat 服务器详细信息已经在 worker.properties.

If you are using name-based virtual hosts, the ServerName inside a section specifies what hostname must appear in the request's Host: header to match this virtual host.

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

您在浏览器中输入的域名作为名为 "Host" 的 HTTP 请求 header 发送到服务器。服务器将 select 通过匹配 ServerName 值和 "Host" HTTP 请求 header.[=17= 中存在的值来为每个请求使用正确的虚拟主机配置]

If no matching ServerName or ServerAlias is found in the set of virtual hosts containing the most specific matching IP address and port combination, then the first listed virtual host that matches that will be used.

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

目前,服务器正在主机 header 中接收 IP“1.2.3.4”,而不是域 "app2.mycompany.com",因此它根据第一个虚拟中的配置提供内容主持人。

解法: 通过修改本地计算机上的主机文件 only 来测试您的新服务器。在主机文件中添加以下行:

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

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

我已经解决了。在我的 windows host.ini 文件中提供主机名条目,然后能够访问应用程序。 IT 团队确认他们会将 DNS 条目放入 Linux 服务器(具有 Apache)并且它会工作。 Nidhi 正在使用 Apache mod_jk 连接器。谢谢!!