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

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

我有一台 Ubuntu 12.04 服务器,它有Redmine已安装在独立 apache 上(所有内容都在 /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 启用/禁用它们。

Redmine:

<VirtualHost *:80>
    ServerAdmin [email protected]
    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>

詹金斯:

<VirtualHost *:80>
    ServerAdmin [email protected]
    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>

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

答案1

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

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

当前配置的情况是,Apache 在看到 Host 标头后立即确定要匹配哪个 vhost。由于“j”按字母顺序排在“r”之前,因此即使两个文件都匹配,它也会优先考虑您的 jenkins vhost 文件。

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

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

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

<VirtualHost *:80>
ServerAdmin [email protected]
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>

相关内容