Apache mod_proxy:多个虚拟主机相互禁用

Max*_*ger 7 redmine virtualhost tomcat6 jenkins apache-2.2

我有一个 Ubuntu 12.04 服务器,它已经在独立的 apache 上安装了Redmine(/opt/redmine 下的所有内容)。我想在同一个系统上安装一个 Jenkins 实例,而不会对现有设置进行太多修改。我希望这两个服务可以分别在 sub.domain.com/redmine 和 sub.domain.com/jenkins 下访问。

我将 Redmines apache 更改为侦听端口 8081 而不是 80,通过 apt 安装了一个额外的 apache,并设置了一个将“/redmine”代理到 localhost:8081/redmine 的虚拟主机。到目前为止一切正常。Redmine 可以像以前一样访问。但是,当我以相同的方式设置 Jenkins 时,tomcat 侦听端口 8080、URL 前缀“jenkins”和一个新的虚拟主机,Redmine 停止工作,即我得到 404。当我删除 Jenkins 虚拟主机时,Redmine 工作再次。

这是 /etc/apache2/sites-available 下的两个文件,我通过 a2ensite/a2dissite 启用/禁用它们。

红米:

<VirtualHost *:80>
    ServerAdmin webmaster@domain.com
    ServerName sub.domain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPreserveHost off
    ProxyPass /redmine http://localhost:8081/redmine
    ProxyPassReverse /redmine http://localhost:8081/redmine
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

詹金斯:

<VirtualHost *:80>
    ServerAdmin webmaster@domain.com
    ServerName sub.domain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPreserveHost off
    ProxyPass /jenkins http://localhost:8080/jenkins
    ProxyPassReverse /jenkins http://localhost:8080/jenkins
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我认为这些文件中的一个或两个存在问题。我从 Jenkins 教程中复制了它们,该教程假设只有一个虚拟主机。无论我在哪里为多个主机寻找 mod_proxy 解决方案,我都会找到将不同端口映射到不同域(即具有不同 ServerName)的示例。但这不是我想要的。我必须使用 RewriteEngine 吗?

Joe*_*man 3

您需要使用单个虚拟主机来处理两者!

Apache 根据 HTTP 主机标头匹配虚拟主机。由于无论客户端访问的是 redmine 还是 jenkins,主机名都是相同的,因此两者必须位于同一虚拟主机中。

当前配置中发生的情况是,Apache 在看到主机标头后立即确定要匹配的虚拟主机。因为按字母顺序“j”位于“r”之前,所以它会优先考虑您的 jenkins vhost 文件,即使两者都匹配。

您正在尝试根据请求 URI 进行匹配,并相应地进行代理。

<Proxy>指令已经内置了此功能!

您可以在单个虚拟主机中使用类似以下内容来实现您的目标:

<VirtualHost *:80>
ServerAdmin webmaster@domain.com
ServerName sub.domain.com
ProxyRequests Off

<Proxy http://sub.domain.com/jenkins>

    Order deny,allow
    Allow from all

    ProxyPreserveHost off
    ProxyPass http://localhost:8080/jenkins
    ProxyPassReverse http://localhost:8080/jenkins

</Proxy>
<Proxy http://sub.domain.com/redmine>

    Order deny,allow
    Allow from all

    ProxyPreserveHost off
    ProxyPass http://localhost:8081/redmine
    ProxyPassReverse http://localhost:8081/redmine

</Proxy>

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)