【问题标题】:All requests being send to first(default) virtual host所有请求都发送到第一个(默认)虚拟主机
【发布时间】:2016-07-18 05:31:53
【问题描述】:

我们正在尝试在 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 网络服务器在机器上B。我需要为此做一些配置吗? worker.properties 中已经有 tomcat 服务器的详细信息。

【问题讨论】:

    标签: apache reverse-proxy virtual-hosts


    【解决方案1】:

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

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

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

    如果在包含最具体匹配的 IP 地址和端口组合的虚拟主机集中没有找到匹配的 ServerName 或 ServerAlias,则将使用首先列出的匹配的虚拟主机。 p>

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

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

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

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

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

    【讨论】:

    • 做到了。还是同样的错误。然 dig 作为 dig app2.mycompany.com。获得 NXDOMAIN 作为状态。 nslookup app2.mycompany.com 给出相同的结果:** 服务器找不到 app2.mycompany.com:NXDOMAIN。 /etc/hosts 文件也包含 127.0.0.1 、 1.2.3.4 和 8.8.8.8 的条目。作为一名开发人员,我不确定还缺少什么。
    • 忘了提到 app1 和 app2 正在 Tomcat 服务器上运行,这些服务器在机器 A 中,而 Apache Web 服务器在机器 B 中。我是否需要在某些 linux 系统文件中为此设置一些配置. Tomcat 服务器条目已经存在于 worker.properties 文件中。
    • 还有一个更新,可以从我的系统ping app2.mycompany.com,尽管从浏览器访问仍然会出现错误 400。
    • 1.当您从您的机器 ping app2.mycompany.com 时,它是否解析为您在主机文件中输入的新服务器的 IP? 2. 在 hosts 文件中添加新服务器的 IP 后,在 Firefox 中浏览 app2.mycomapny.com。 “远程地址”的值是多少?您可以在开发者工具的“网络”选项卡的“标题”部分下找到它。
    • 您使用哪个 Apache 模块将请求从 apache 转发到 tomcat?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 2011-07-22
      • 2017-01-26
      • 2019-11-29
      • 2013-10-15
      • 2018-03-23
      • 2014-11-04
      • 2023-04-10
      相关资源
      最近更新 更多