Apache2 + Tomcat: o recebimento de solicitações por meio do apache2 resulta em tempo limite e erro de proxy

1

Portanto, usamos o apache como um proxy reverso para enviar uma solicitação ao nosso solr (aplicativo de pesquisa) que está hospedado no tomcat.

Temos outro servidor hospedado no jboss que envia dados em formato binário para o apache, que por sua vez envia para o tomcat para ser indexado e colocado no banco de dados solr. Os dados são enviados como solicitação POST multipartida. Esse processo pode levar até 8 horas.

Então, aqui está o problema, quando enviamos os dados através do apache, por cerca de 30-40 minutos no meio da indexação (a parte de envio de dados), vamos receber um monte de proxy e erro de gateway ruim no jboss ( aquele que envia dados), e no log do tomcat, ele dirá que os dados recebidos têm um EOF inválido. Portanto, é óbvio que os dados não são enviados corretamente. E se olharmos para os logs do apache, há muito desse erro:

[Wed Jan 08 16:10:45 2014] [error] [client 10.60.6.6] (70007)The timeout specified has expired: proxy: error reading status line from remote server localhost:8080
[Wed Jan 08 16:10:45 2014] [error] [client 10.60.6.6] proxy: Error reading from remote server returned by /application-path/application-url

e este erro:

[Mon Jan 13 11:38:49 2014] [error] (103)Software caused connection abort: proxy: pass request body failed to [::1]:8080 (localhost)
[Mon Jan 13 11:38:49 2014] [error] proxy: pass request body failed to [::1]:8080 (localhost) from 10.3.40.76 ()

O mais estranho é que, se ignorarmos o apache (: 80) e enviarmos os dados diretamente para o tomcat (: 8080), nunca encontramos esse problema. No início, esse problema pode parecer o mesmo que isto .

Mas o tomcat e o apache não mantêm viva a atividade ativada.

Timeout 120
KeepAlive Off

<VirtualHost *:80>
  ServerName application.com
  ServerAlias x.application.com
  DocumentRoot /var/www/something/
  ServerAdmin [email protected]

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{soapAction}i\"" logging
  CustomLog /log/httpd/access.log logging
  ErrorLog /log/httpd/error.log

  ServerSignature On

  RewriteEngine On
  RewriteLogLevel 2

  # ensure that Tomcat sees the original host and port (and not the proxy-host and -port)
  ProxyPreserveHost On

  # Rewrite Rules 
  RewriteRule ^/application-path/(.*) http://localhost:8080/application-path/$1 [P]
</VirtualHost>

e no tomcat

<Connector connectionTimeout="10000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" maxThreads="1000" processorCache="1000" maxKeepAliveRequests="1"
keepAliveTimeout="10" socket.soReuseAddress="true" socket.soKeepAlive="true"
compression="on" compressionMinSize="10"
compressableMimeType="text/html,text/xml,text/plain,application/javascript,application/json,text/javascript,text/css"
socket.soLingerOn="false" socket.soLingerTime="0" URIEncoding="UTF-8" />

E para aqueles que estão se perguntando, sim, o apache tem um tempo limite maior que o tomcat, e ambos mantêm o keep-alive desativado, então não faz sentido porque o apache retornará um tempo limite quando o tomcat não.

    
por Rowanto 13.01.2014 / 11:10

1 resposta

1

Tivemos um problema semelhante ao seu. Ignoramos o Apache completamente usando o iptables para encaminhar todo o tráfego da porta 80 para 8080. Não tenho certeza se isso funcionará para você ou não.

Você também pode ter o tomcat listen na porta 80. (Não tenho certeza se você tem outros sites ouvindo em 80 ou não.)

    
por 05.06.2014 / 15:41