
Entonces usamos Apache como proxy inverso para enviar solicitudes a nuestra solr (aplicación de búsqueda) que está alojada en Tomcat.
Tenemos otro servidor alojado en jboss que envía datos en formato binario al apache, que a su vez los envía a tomcat para que los indexe y los coloque en la base de datos solr. Los datos se envían como una solicitud POST de varias partes. Este proceso puede tardar hasta 8 horas.
Entonces aquí está el problema, cuando enviamos los datos a través de Apache, durante aproximadamente 30 a 40 minutos en medio de la indexación (la parte de envío de datos), recibiremos una gran cantidad de proxy y un error de puerta de enlace incorrecta en el jboss (el que envía datos), y en el registro de Tomcat, dirá que los datos recibidos tienen un EOF no válido. Entonces es obvio que los datos no se envían correctamente. Y si miramos los registros de Apache, hay muchos errores de este tipo:
[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
y este error:
[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 ()
Lo extraño es que si omitimos Apache (:80) y enviamos los datos directamente a Tomcat (:8080), nunca encontraremos este problema. Al principio, este problema podría parecer el mismo queeste.
Pero Tomcat y Apache no tienen activado el mantenimiento de vida.
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>
y en gato
<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" />
Y para aquellos que se preguntan, sí, Apache tiene un tiempo de espera mayor que Tomcat, y ambos tienen el mantenimiento de vida desactivado, por lo que no tiene sentido por qué Apache devolverá un tiempo de espera cuando Tomcat no lo hace.
Respuesta1
Tuvimos un problema similar al suyo. Omitimos Apache por completo utilizando iptables para reenviar todo el tráfico desde el puerto 80 al 8080. No estoy seguro de si esto funcionará para usted o no.
También puede hacer que Tomcat escuche en el puerto 80. (No estoy seguro si tiene otros sitios escuchando en el puerto 80 o no).