Configurei um proxy reverso Apache v2.4 em uma máquina CentOS 7, atendendo requisições para vários vhosts; entre eles estão os servidores de aplicativos Atlassian.
O endereço IP privado do proxy é 10.0.0.77, seu endereço IP público é 77.77.77.77 e vários registros DNS A mapeiam o IP público para vários FQDN: foo.example.com
, bar.example.com
, etc.
Existe um NAT em vigor:
77.77.77.77:10080 -> 10.0.0.77:80
77.77.77.77:10443 -> 10.0.0.77:443
o que é necessário porque o endereço IP público do proxy também é usado para outros serviços. A configuração é a mesma que esta outra pergunta .
Aqui abaixo está um exemplo de configuração do vhost (simplificado), /etc/httpd/conf.d/foo.conf
:
<VirtualHost *:80>
ServerName foo.example.com
ProxyRequests Off
ProxyPreserveHost Off
SetEnv proxy-nokeepalive 1
Redirect "/" "https://foo.example.com:10443/"
</VirtualHost>
<VirtualHost *:443>
ServerName foo.example.com
ServerSignature On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
SSLEngine On
SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
# SSLCipherSuite shortened here for simplicity
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384"
SSLCertificateFile /etc/httpd/ssl/proxy.crt
SSLCertificateKeyFile /etc/httpd/ssl/proxy.key
SSLCACertificateFile /etc/httpd/ssl/proxy.ca.crt
ProxyRequests Off
ProxyPreserveHost On
ProxyPass "/" "http://foo.example.com:8080/"
ProxyPassReverse "/" "http://foo.example.com:8080/"
</VirtualHost>
Essa configuração funciona bem com dois servidores Jira, um servidor Stash, um servidor Confluence v6.10 e vários outros servidores. No entanto, o navegador da Web falha ao carregar um vhost de servidor proxy Bamboo v6.4 e uma plataforma Question2Answer.
No Firefox, o erro relatado é NS_ERROR_NET_TIMEOUT
. No IE o erro é:
Ocorreu um erro de DNS temporário. Tente atualizar a página.
Código de erro: INET_E_RESOURCE_NOT_FOUND
No log de acesso httpd para cada vhost com falha não há nada, nem mesmo em LogLevel trace8
, então aparentemente a solicitação nem chega ao proxy.
Eu posso acessar o Bamboo via curl do proxy ( -L
é necessário um sinalizador, pois o Bamboo atende a 302):
[root@proxy]# curl -XGET http://bamboo.example.com:8085/
[root@proxy]# curl -v -XGET http://bamboo.example.com:8085/
* About to connect() to bamboo.example.com port 8085 (#0)
* Trying 10.0.0.11...
* Connected to bamboo.example.com (10.0.0.11) port 8085 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: bamboo.example.com:8085
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: Apache-Coyote/1.1
< X-ASEN: SEN-4619603
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Vary: Accept-Encoding
< Set-Cookie: JSESSIONID=E4D13B8AD7D4D172F4E5F834D1E89710; Path=/; Secure; HttpOnly
< Cache-Control: no-store
< Location: /userlogin!doDefault.action?os_destination=%2Fstart.action
< Content-Language: en-US
< Content-Length: 0
< Date: Mon, 01 Oct 2018 15:06:19 GMT
<
* Connection #0 to host bamboo.example.com left intact
[root@proxy]# curl -L -XGET http://bamboo.example.com:8085/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Log in as a Bamboo user</title>
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />
<meta name="application-name" content="Bamboo" />
(...)
O firewall nos servidores de destino é aberto do servidor para o proxy (observe que os aplicativos Atlassian são executados em portas não padrão, por exemplo, o Jira fornece conteúdo em TCP/8080).
Estou intrigado porque quase todos os outros vhosts funcionam perfeitamente. Também verifiquei cuidadosamente o caminho da URL e está correto.
Qual poderia ser a causa deste problema?
Existe uma maneira de rastrear a solicitação HTTP de uma maneira melhor? Eu uso o complemento HTTP Header Live do Firefox por enquanto e gostaria de encontrar alguma ferramenta mais complexa.
Você deve conseguir ver algo no log de erros do Apache para as solicitações com falha se o problema estiver no arquivo config. Geralmente eles estão em
/var/log/apache2/error.log
ou em algum lugar semelhante. Os tempos limite indicam que não é possível acessar o servidor de back-end na configuração. Como você pode alcançá-lo com curl, provavelmente seria um problema de configuração.Se não houver nada lá ou o log de acesso (no mesmo local) para as solicitações que você está fazendo, provavelmente elas não estão alcançando o proxy para começar. Eu verificaria se a configuração de DNS para bamboo.example.com está correta e apontando para o seu proxy conforme o esperado.
Você pode usar
curl
para acessar o proxy externamente para ver o que está acontecendo com mais detalhes. Tentedig
ounslookup
primeiro verifique se o nome está resolvendo para o IP que você espera.Meu palpite seria que é um problema entre cliente -> proxy, porque se fosse um tempo limite no proxy -> backend, você provavelmente obteria um código de erro 504 no navegador.
O erro relatado pelo IE me alertou. Os registros DNS A para os vhosts com falha não apontam para o servidor proxy, mas para os IPs privados dos servidores.
Não encontrei o problema mais cedo porque o Firefox relatou apenas um tempo limite genérico.