Apache mod_proxy: vários hosts virtuais desativam uns aos outros

6

Eu tenho um servidor Ubuntu 12.04, que tinha Redmine já instalado em um apache autônomo (tudo sob / opt / redmine) . Eu queria instalar uma instância do Jenkins no mesmo sistema, sem modificar muito a configuração existente. Eu quero que os dois serviços sejam acessíveis sob sub.domain.com/redmine e sub.domain.com/jenkins respectivamente.

Eu alterei o Redmines apache para escutar na porta 8081 em vez de 80, instalei um apache adicional via apt e configurei um host virtual que envia proxies '/ redmine' para localhost: 8081 / redmine. Até agora tudo funcionou bem. Redmine estava acessível como antes. No entanto, quando eu configurei o Jenkins da mesma forma, com o tomcat escutando na porta 8080, o prefixo de URL 'jenkins' e um novo host virtual, o Redmine para de funcionar, ou seja, eu recebo um 404. Quando eu removo o host virtual do Jenkins, o Redmine funciona novamente.

Aqui estão os dois arquivos em / etc / apache2 / sites-available, que eu habilito / desabilito via 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>

Jenkins:

<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>

Suponho que haja um problema com um ou ambos os arquivos. Eu os copiei de um tutorial do Jenkins que assumia apenas um único host virtual. Sempre que procuro soluções mod_proxy para vários hosts, eu localizo exemplos que mapeiam portas diferentes para domínios diferentes, ou seja, com nomes de servidores diferentes. Mas isso não é o que eu quero. Eu tenho que usar o RewriteEngine?

    
por Max Hohenegger 17.08.2014 / 18:41

1 resposta

3

Você precisa usar um único host virtual para lidar com ambos!

O Apache faz a correspondência dos vhosts com base no cabeçalho do host HTTP. Como o nome do host é o mesmo, independentemente de um cliente estar acessando o redmine ou o jenkins, ambos devem no mesmo vhost.

O que está acontecendo com sua configuração atual é que o Apache está determinando qual vhost deve ser correspondido assim que ele vir o cabeçalho do Host. Como 'j' vem antes de 'r' em ordem alfabética, ele está dando prioridade ao seu arquivo vhost jenkins, mesmo que ambos correspondam.

Você está tentando corresponder com base no URI da solicitação e no proxy de acordo.

A diretiva <Proxy> já tem essa funcionalidade incorporada!

Você pode usar algo como o seguinte em um único vhost para atingir seu objetivo:

<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>
    
por 17.08.2014 / 19:58