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:::
Respostas:
Eu solucionei o problema. O
Keepalive=On
deve ser inserido naProxyPass
linha de configuração:Veja isso
lá? É crítico ;)
fonte
Keepalive=On
crítico?timeout=600
ouretry=1
que corrige isso? (ou a combinação)Você já tentou configurar
setenv proxy-initial-not-pooled 1
?Referência aqui
fonte
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.fonte
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
Para mim, remover um valor de cabeçalho chamado
Transfer-Encoding" (binary)
em meu servidor-aplicativo (PHP) resolveu o problema de:Todas as outras sugestões gostaram
SetEnv proxy-initial-not-pooled
ouKeep-Alive
não.fonte
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.
fonte