Como vincular portas específicas a domínios específicos com hosts virtuais Apache?

1

Temos uma caixa linux voltada para frente que executa o servidor Apache HTTP e age como um proxy reverso para vários servidores back-end. Os servidores são acessados por meio de nomes de domínio e portas específicos e são configurados como hosts virtuais no Apache da seguinte maneira:

Listen 8001
Listen 8002

<Virtualhost *:8001>
    ServerName service.one.mycompany.com

    ProxyPass / http://internal.one.mycompany.com:8001/
    ProxyPassReverse / http://internal.one.mycompany.com:8001/

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
    RewriteRule .* - [F]
</Virtualhost>

<Virtualhost *:8002>
    ServerName service.two.mycompany.com

    ProxyPass / http://internal.two.mycompany.com:8002/
    ProxyPassReverse / http://internal.two.mycompany.com:8002/

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
    RewriteRule .* - [F]
</Virtualhost>

O servidor proxy tem apenas um endereço IP e os dois domínios apontam para ele. Acessando internal.one via service.one funciona bem, assim como o acesso interno.two via service.two.

Agora, o problema é que o Apache não leva em consideração o domínio solicitante ao acessar os hosts virtuais. O que quero dizer é que ambos os domínios funcionam para ambas as portas: solicitações para service.one: 8002 proxies para internal.two: 8002 e solicitações para service.two: 8001 proxies para internal.one:8001, onde idealmente ambos os pedidos devem ser negado.

Eu posso contornar isso criando mais hosts virtuais que negam explicitamente essas solicitações:

NameVirtualHost *:8001
NameVirtualHost *:8002

<Virtualhost *:8001>
        ServerName service.two.mycompany.com
        Redirect permanent / http://errorpage.mycompany.com/
</Virtualhost>
<Virtualhost *:8002>
        ServerName service.one.mycompany.com
        Redirect permanent / http://errorpage.mycompany.com/
</Virtualhost>

Mas esta não é uma solução ideal, pois planejamos adicionar mais serviços ao proxy, e cada nova porta precisaria ser explicitamente negada em todos os outros domínios, e cada novo domínio precisaria ser explicitamente negado a todos os outros. portas não está utilizando. À medida que adicionamos mais serviços, o número de hosts virtuais pode ficar fora de controle rapidamente.

Minha pergunta, então, é se existe uma maneira melhor? Podemos vincular explicitamente portas específicas a domínios específicos em um host virtual, de modo que apenas essa combinação de portas de domínio seja processada e todas as outras combinações não sejam?

Coisas que tentei:

  • Adicionando NameVirtualHost *: 8001, etc. sem os hosts virtuais adicionais.
  • Configurando ProxyRequests On e Off, bem como ProxyPreserveHost On e Fora
  • Adicionando o nome do servidor ou o endereço IP ao cabeçalho do host virtual, por exemplo. < VirtualHost service.one.mycompany.com:8001>
  • Usando o tag < proxy > diretiva dentro da diretiva de host virtual.
  • Muitos e muitos googling.

O servidor proxy está executando o servidor Apache HTTPD do CentOS 6.2 de 64 bits 2.2.15. Como mencionado, o servidor proxy tem apenas um endereço IP e todos os domínios que estamos usando apontam para ele.

    
por theJoe 27.06.2012 / 16:53

1 resposta

1

O Apache sempre desejará um retorno padrão para uma determinada porta, que é o que você está vendo agora. Portanto, mesmo que o nome do servidor não corresponda, este é seu último / único recurso. Essa é a razão pela qual há um padrão-000 como padrão.

Você pode usar mod_rewrite na configuração do vhost para bloquear / redirecionar explicitamente qualquer domínio que não corresponda.

RewriteCond %{SERVER_NAME} !my.domain.com
RewriteRule (.*)$ http://my.domain.com$1 [L,R=301]
    
por 27.06.2012 / 21:43