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.