Erro intermitente ao usar mod_proxy para executar proxy reverso no serviço SOAP

17

Eu recebo esse erro a cada poucos minutos ao usar o mod_proxy como um proxy reverso para um serviço da web SOAP. Provavelmente existem 3 ou 4 solicitações por segundo, por isso estamos falando de 1 ou 2 em cada mil que possuem esse erro.

[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] (20014)Internal error: proxy: error reading status line from remote server soap1.server:8888
[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] proxy: Error reading from remote server returned by /someapp/path/to/web/service

Isso faz com que a solicitação falhe. Se eu tiver o cliente conectado diretamente ao servidor soap sem usar o proxy, o sucesso será de 100%, portanto o problema parece estar no proxy

A configuração é assim. O objetivo é alternar para um servidor de backup se o principal não estiver disponível:

<Proxy balancer://apicluster>  
BalancerMember http://soap1.server:8888 lbset=0 
BalancerMember http://soap2.server:8888 lbset=1 
</Proxy>  

ProxyPass /someapp balancer://apicluster/someapp 
ProxyPassReverse / balancer://apicluster/someapp 

Alguém já se deparou com isso e encontrou uma correção? Há algumas menções nos relatórios de erros, mas não há soluções. A única coisa que pode ser incomum é que a solicitação do cliente pode ter 100 MB ou mais; portanto, a solicitação pode demorar um pouco mais do que o esperado para uma chamada SOAP.

JOTN
fonte
A resposta de David Purdue (SetEnv proxy-initial-not-pooled 1) é uma resposta válida atualmente (2016).
Matt Bianco

Respostas:

27

Caso alguém encontre isso. Este é um bug no mod_proxy que pode ser evitado colocando estas linhas no seu httpd.conf:

SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1

https://issues.apache.org/bugzilla/show_bug.cgi?id=37770

Para informações sobre o que essas variáveis ​​fazem, consulte a mod_proxydocumentação . Eles possuem uma seção específica, Protocolo de Ajuste, que trata dessas variáveis.

JOTN
fonte
5

Tome nota da documentação do Apache aqui: http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html

Parece que existe uma condição de corrida em mod_proxy_http, mas pode ser evitada incluindo:

SetEnv proxy-initial-not-pooled 1

O que impede o Apache de usar uma conexão em pool se esta for uma solicitação inicial.

O documento observa que essa configuração fornecerá um downgrade de desempenho.

David Purdue
fonte
1
proxy-initial-not-pooledsó é eficaz se você tiver um patch específico, que acredito não fazer parte do httpd 2.2. Eu não sei sobre o httpd 2.4. Veja bz.apache.org/bugzilla/show_bug.cgi?id=37770#c88
kubanczyk
0

Você também pode suprimir essa mensagem de erro relacionada (AH01102: error reading status line from remote server ) usando o módulo apache mod_reqtimeout e esta diretiva conf:

RequestReadTimeout header=30

Você provavelmente precisará ativar o módulo reqtimeout, da seguinte maneira:

$ sudo a2enmod reqtimeout
$ sudo apache2ctl restart
Martlark
fonte