我有一台 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>