Skip to content. | Skip to navigation

Cleber J Santos

Sections
Personal tools
Document Actions

Proxy Error: Plone ou Apache?

Por Cleber J Santos em 24-06-2009 13:38

Esse erro significa que o servidor que você acessou atua como um proxy ou gateway e que o servidor "acima" dele reportou algum erro ao tentar completar a requisição, também conhecido como 502 bad gateway.

É realmente muito chato quanto um cliente te liga dias dizendo que o site dele está dando este tipo de problema, é quando você começa a perder os cabelos tentado achar onde está o problema. Normalmente não é complicado achar o gargalo, mas neste caso aqui me tirou alguns dias de pesquisas.

Efetuei alguns testes e pesquisas sobre os erros no log do Apache, pois o Zope não estava registrando nehum erro em seus logs, já o Apache mostrou-se saber bem dos erros:

$ less logs/error_log | grep 'The timeout 

[Sat Mar 14 17:30:46 2009] [error] (70007)The timeout specified has
expired: proxy: prefetch request body failed to 127.0.0.1:8001
(127.0.0.1) from xxx.xxx.xx.xx ()

[Sat Mar 14 17:31:36 2009] [error] (70007)The timeout specified has
expired: proxy: prefetch request body failed to 127.0.0.1:8001
(127.0.0.1) from xxx.xxx.xx.xx (


$ tail -f logs/error_log

[Wed Mar 25 17:33:54 2009] [error] [client xxx.xxx.xxx.xxx] proxy:
Error reading from remote server returned by
/atividades/portal_factory/atividade/atividade.2009-03-25.7299552564/base_edit,
referer:
http://www.siteinocente.com.br/atividades/portal_factory/atividade/atividade.2009-03-25.7299552564/edit
[Thu
Mar 26 02:30:37 2009] [error] [client xx.xxx.xx.xxx] Invalid URI in
request GET /../banco-de-imagens/Logo%20Iguatemi.jpg/image_preview
HTTP/1.0, referer: http://www.siteinocente.com.br

A questão era agora descobrir onde estava o gargalo, e como trata-se de uma versão do apache meio suspeita (Sim, já tive este mesmo problema em outro cliente 'Server version: Apache/2.2.3'), resolvi procurar ler a documentação (http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#envsettings). Percebi então que isso é um bug dessa versão do Apache,

por que?

Bem, isso poderia ocorrer por um dos 3 motivos:

  •   Timeout = Lentidão de resposta na rede local [(70007)The timeout specified has expired];
  •   Plone sendo restartado constantemente;
  •   Fim do processamento da página encontrado, isso é repassado ao Apache como um cabeçalho falso indicando que a página chegou ao fim;

Normalmente o cabeçalho é disparado ao Zope/plone e no qual fecharia a conexão corretamente.

Em https://issues.apache.org/bugzilla/show_bug.cgi?id=37770, existe uma discussões, no qual este Bug no Apache é mencionado, ou seja, isso pode ser gerado de através da visitas de Robôs, como o google robots ou ainda por quase todos os buscadores, claro, não apenas por isso, mas nada mais é do que um bug no modulo proxy (mod_proxy).

Agora as coisas assam a ficar um cadinho mais fácil né :-) descoberto nosso gargalo vamos a solução.


Solução:


Podemos migrar para a versão 2.2.10 do Apache ou se tiver alguma mais atual, onde o bug esta corrigido, ou colocar dois parâmetros no arquivo de configuração do virtual host, que são:
<VirtualHost *:80> 
   SetEnv force-proxy-request-1.0 1
  SetEnv proxy-nokeepalive 1
</VirtualHost>
Isso força o mod_proxy a enviar os pedidos de utilização HTTP/1.0 sem KeepAlive, burlando assim o problema de proxy error.

Porém, cada caso é um caso, aqui o problema que ocorreu foi por conta deste Bug, mas poderia ser outros milhares de problemas, por isso é sempre bom dar uma lida nos Logs de qualquer aplicação, isso ajuda muito, como foi no meu caso.

Até a próxima.