Erro de proxy 502 “Motivo: erro ao ler do servidor remoto” com o Apache 2.2.3 (Debian) mod_proxy e o Jetty 6.1.18

80

O Apache está recebendo solicitações na porta: 80 e enviando um proxy para o Jetty na porta: 8080

The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /.

Meu dilema: tudo funciona bem normalmente (solicitações rápidas, alguns segundos ou dezenas de segundos, pedidos longos são processados ok ). Os problemas ocorrem quando o processamento da solicitação leva muito tempo (alguns minutos?).

Se eu emitir uma solicitação diretamente ao Jetty na porta: 8080, a solicitação será processada OK. Portanto, é provável que o problema esteja em algum lugar entre o Apache e o Jetty, onde estou usando o mod_proxy . Como resolver isso?

Eu já tentei alguns "truques" relacionados às configurações do KeepAlive, sem sorte. Aqui está minha configuração atual, alguma sugestão?

#keepalive Off                     ## I have tried this, does not help
#SetEnv force-proxy-request-1.0 1  ## I have tried this, does not help
#SetEnv proxy-nokeepalive 1        ## I have tried this, does not help
#SetEnv proxy-initial-not-pooled 1 ## I have tried this, does not help
KeepAlive 20                       ## I have tried this, does not help
KeepAliveTimeout 600               ## I have tried this, does not help
ProxyTimeout 600                   ## I have tried this, does not help

NameVirtualHost *:80
<VirtualHost _default_:80>
    ServerAdmin [email protected]

    ServerName www.mydomain.fi

    ServerAlias mydomain.fi mydomain.com mydomain www.mydomain.com

    ProxyRequests On
    ProxyVia On
    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyRequests Off
    ProxyPass / http://www.mydomain.fi:8080/ retry=1 acquire=3000 timeout=600
    ProxyPassReverse / http://www.mydomain.fi:8080/

    RewriteEngine On
    RewriteCond %{SERVER_NAME} !^www\.mydomain\.fi
    RewriteRule /(.*) http://www.mydomain.fi/$1 [redirect=301L]

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

</VirtualHost>

Aqui também está o log de depuração de uma solicitação com falha:

74.125.43.99 - - [29/Sep/2010:20:15:40 +0300] "GET /?wicket:bookmarkablePage=newWindow:com.mydomain.view.application.reports.SaveReportPage HTTP/1.1" 502 355 "https://www.mydomain.fi/?wicket:interface=:0:2:::" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: error reading status line from remote server www.mydomain.fi, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: Error reading from remote server returned by /, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::

fonte
Oi .. Eu ainda estou preso com este. Todas as configurações acima tentadas e também aumentar o jetty maxIdleTime não ajudaram. Alguma dica sobre o que tentar a seguir?
Martin Martin

Respostas:

91

Eu solucionei o problema. O Keepalive=Ondeve ser inserido na ProxyPasslinha de configuração:

ProxyPass / http://www.dom.fi:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On

Veja isso

Keepalive=On

lá? É crítico ;)

Martin
fonte
9
Acredito que você pode marcar suas próprias respostas como Aceitas. Ele marca a pergunta como resolvida no sistema para outras pessoas encontrarem.
sysadmin1138
Onde exatamente você coloca isso?
AlxVallejo 27/01
1
@AlxVallejo Você deve encontrar os seus arquivos de configuração aqui /etc/apache2/sites-enabled/[sitename].conf
Steven
1
Temos exatamente os mesmos erros de proxy. Eles acontecem muito raramente (um em cada mil pedidos). Por que exatamente isso é Keepalive=Oncrítico?
Dokaspar
Não poderia ser o timeout=600ou retry=1que corrige isso? (ou a combinação)
Matt Bianco
4

Você já tentou configurar setenv proxy-initial-not-pooled 1?

Referência aqui

TCampbell
fonte
Não, isso não ajudou. Então não se trata de condição de corrida, é o longo atraso e algo acontece no meio (algum tipo de mal-entendido entre Jetty e mod_proxy).
4

Este erro também pode ocorrer se você não terminar seu URL de proxy com a /. Ambos os caminhos devem terminar com um /ou nenhum.

Marca
fonte
1

Observando o log, há algo que atinge o tempo limite em 5 minutos (= 300 segundos). É muito tempo para esperar por uma resposta. Quando você acessa o servidor Jetty diretamente, esse recurso realmente leva muito tempo para produzir uma resposta?

Se os cinco minutos realmente estiverem dentro dos possíveis tempos de resposta, tente ajustar a diretiva de configuração ProxyTimeout.

Dependendo da configuração da sua rede, pode ser que não haja motivo para tentar usar qualquer sistema de manutenção de atividade (existe um firewall entre o servidor de aplicativos e o proxy que pode ser configurado para interromper as sessões inativas por muito tempo?) , mas o ProxyTimeout afetaria o comportamento do próprio proxy.

Se o mesmo proxy também atender a outros back-ends, seria melhor manter o ProxyTimeout atual e configurar o tempo limite na diretiva ProxyPass (consulte a documentação do mod_proxy).

Se, no entanto, as respostas sem o proxy consistirem em algo muito menor do que os cinco minutos vistos aqui como o limite, pode haver realmente alguma interferência estranha entre o proxy e o servidor de aplicativos, mas você não fornecerá nada valor para identificar o que pode ser.


fonte
"Quando você acessa o servidor Jetty diretamente, esse recurso realmente leva muito tempo para produzir uma resposta?" -- SIM. Eu também tentei definir este ProxyTimeout para 600. Não ajuda. Não há firewall entre proxy e jetty. O tempo limite também está configurado no ProxyPass.
"você não está fornecendo nada de valor para identificar o que pode ser": não sei o que poderia ser. Tudo o que estou recebendo é uma mensagem de erro do servidor: Erro de proxy O servidor proxy recebeu uma resposta inválida de um servidor upstream. O servidor proxy não pôde lidar com a solicitação GET /. Razão: Erro ao ler do servidor remoto
Quanto ao aumento do tempo limite do proxy, isso também mudou o tempo em que o navegador girou antes de receber o erro 502?
Depois, de maneiras como você pode descobrir o que está acontecendo no servidor de aplicativos: você pode fazer alguns despejos de encadeamentos e ver neles o que está sendo executado quando o navegador está aguardando. Como alternativa, adicione instruções de log de depuração suficientes para poder rastrear seu código para identificar a causa da lentidão.
Eu sei porque é lento. Não sei por que o proxy apache recusa a resposta quando finalmente está pronto.
0

Para mim, remover um valor de cabeçalho chamado Transfer-Encoding" (binary)em meu servidor-aplicativo (PHP) resolveu o problema de:

[proxy_http: erro] [pid 17623] (22) Argumento inválido: [cliente 127.0.0.1:44929] AH01102: erro ao ler a linha de status do servidor remoto 0.0.0.0:80

Todas as outras sugestões gostaram SetEnv proxy-initial-not-pooledou Keep-Alivenão.

stackoverclan
fonte
0

Se as soluções acima não funcionarem, uma coisa que você pode tentar é ativar todos os seus módulos apache para garantir que não exista algum módulo necessário que tenha sido desativado acidentalmente.

Por exemplo, como encontrei a causa do meu problema foi substituir todas as instâncias do #LoadModule pelo LoadModule em todos os meus arquivos de configuração do Apache. Como isso resolveu o problema para mim, eu sabia que meu problema não era um argumento de diretiva "KeepAlive" ausente, mas sim que meu problema era uma dependência ausente.

Porque, lembre-se, os arquivos .so são basicamente bibliotecas estáticas. Ter um módulo ativado não significa que ele será usado, mas ter um desativado significa que ele não pode ser usado e, portanto, tudo o que depende dele necessariamente falhará.

Nota: esta resposta recebeu alguns votos negativos devido ao fato de que minha resposta inicial parecia sugerir deixar todos os módulos ativados para sempre. Embora você possa fazer isso teoricamente sem necessariamente quebrar nada, obviamente não é uma solução de práticas recomendadas.

Então, entenda, estou apenas sugerindo isso como uma etapa de solução de problemas, não como uma solução final.

Além disso, observe: eu uso um projeto git especial para rastrear todos os arquivos de configuração apache da minha máquina local. Dessa forma, eu posso executar esses tipos de operações globais de pesquisa e substituição no meu diretório de trabalho de configuração do apache, como uma etapa de solução de problemas. Se a ativação de todos os módulos for bem-sucedida, tente desativá-los novamente um por um e reinicie o apache no meio, até encontrar qual módulo é o que precisa permanecer ativado. Depois de descobrir isso, redefina o repositório de volta ao seu estado original e ative apenas o módulo que precisa permanecer ativado.

Você também descobrirá que o uso do git para rastrear seus arquivos de configuração do apache limpa esses diretórios, pois você não precisará mais desses arquivos .bak e .default antiquados.

CommaToast
fonte
1
cada biblioteca traz um recurso diferente, não necessariamente relacionado ao proxy
Arnold Roa