remote reading from error java apache tomcat mod-proxy

java - reading - Error de Bad Gateway 502 con Apache mod_proxy y Tomcat



error reading from remote server proxypass (8)

Estamos ejecutando una aplicación web en Tomcat 6 y Apache mod_proxy 2.2.3. Al ver un montón de 502 errores como este:

Mala puerta de enlace! El servidor proxy recibió una respuesta no válida de un servidor en sentido ascendente.

El servidor proxy no pudo manejar la solicitud GET /the/page.do.

Motivo: Error al leer desde un servidor remoto

Si cree que se trata de un error del servidor, póngase en contacto con el webmaster.

Error 502

Tomcat tiene muchos hilos, por lo que no está restringido por hilos. Estamos presionando a 2400 usuarios a través de JMeter en contra de la aplicación. Todas las cajas están ubicadas dentro de nuestro firewall en una red rápida descargada, por lo que no debería haber problemas de red.

Alguien tiene alguna sugerencia para cosas que mirar o probar? Nos dirigimos a tcpdump el próximo.

ACTUALIZACIÓN 21/10/08: Todavía no he descubierto esto. Al ver solo un número muy pequeño de estos bajo carga. Las respuestas a continuación no han proporcionado ninguna respuesta mágica ... todavía. :)


Debería poder resolver este problema a través de un parámetro timeout y proxyTimeout establecido en 600 segundos. Me funcionó después de luchar por un tiempo.


Entonces, respondiendo mi propia pregunta aquí. Finalmente determinamos que estábamos viendo errores 502 y 503 en el equilibrador de carga debido a que los subprocesos de Tomcat se agotaban. En el corto plazo aumentamos el tiempo de espera. A más largo plazo, solucionamos los problemas de la aplicación que estaban causando los tiempos de espera en primer lugar. El porqué los tiempos de espera de Tomcat se percibían como 502 y 503 errores en el equilibrador de carga aún es un misterio.


Lo más probable es que aumente el parámetro Timeout en apache conf (valor predeterminado 120 seg)


Muestra de apache conf:

# Valor predeterminado es 2 minutos.
Tiempo de espera 600
ProxyRequests desactivado
ProxyPass / balancer de aplicación: // MyApp stickysession = JSESSIONID lbmethod = bytraffic nofailover = On
ProxyPassReverse / app balancer: // MyApp
ProxyTimeout 600
<Equilibrador de proxy: // MyApp>
BalancerMember http://node1:8080/ route = node1 retry = 1 max = 25 timeout = 600
.........
</ Proxy>


Puede evitar los tiempos de espera globales o tener hosts virtuales especificando los tiempos de espera de proxy en la directiva ProxyPass de la siguiente manera:

ProxyPass /svc http://example.com/svc timeout=600 ProxyPassReverse /svc http://example.com/svc timeout=600

timeout=600 aviso timeout=600 segundos.

Sin embargo, esto no siempre funciona cuando tienes balanceador de carga. En ese caso, debe agregar los tiempos de espera en ambos lugares (probado en Apache 2.2.31)

Ejemplo de Load Balancer:

<Proxy "balancer://mycluster"> BalancerMember "http://member1:8080/svc" timeout=600 BalancerMember "http://member2:8080/svc" timeout=600 </Proxy> ProxyPass /svc "balancer://mycluster" timeout=600 ProxyPassReverse /svc "balancer://mycluster" timeout=600

Una nota al margen: el timeout=600 en ProxyPass no era necesario cuando Chrome era el cliente (no sé por qué), pero sin este tiempo de espera en ProxyPass Internet Explorer (11) cancela el restablecimiento de la conexión por parte del servidor.

Mi teoría es que el:

ProxyPass tiempo de espera de ProxyPass se usa entre el cliente (navegador) y el Apache.

BalancerMember tiempo de espera de BalancerMember se usa entre el Apache y el back-end.

Para aquellos que usan Tomcat u otro respaldado, es posible que también desee prestar atención a los tiempos de espera de HTTP Connector.


Puede usar proxy-initial-not-mangement

Ver http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html :

Si se establece esta variable, no se reutilizará ninguna conexión agrupada si la conexión del cliente es una conexión inicial. Esto evita el mensaje de error "proxy: error al leer la línea de estado desde el servidor remoto" causado por la condición de carrera que el servidor backend cerró la conexión agrupada después de la verificación de conexión por el proxy y antes de que los datos enviados por el proxy llegaran al backend. Debe tenerse en cuenta que establecer esta variable degrada el rendimiento, especialmente con clientes HTTP / 1.0.

Tuvimos este problema, también. Lo arreglamos agregando

SetEnv proxy-nokeepalive 1 SetEnv proxy-initial-not-pooled 1

y apagar keepAlive en todos los servidores.

mod_proxy_http está bien en la mayoría de los escenarios pero lo estamos ejecutando con mucha carga y todavía tenemos algunos problemas de tiempo de espera que no entendemos.

Pero vea si la directiva anterior se ajusta a sus necesidades.


Solo para agregar algunas configuraciones específicas, tuve una configuración similar (con proxy inverso Apache 2.0.63 en Tomcat 5.0.27).

Para ciertas URL, el servidor Tomcat podría tardar unos 20 minutos en devolver una página.

Terminé modificando las siguientes configuraciones en el archivo de configuración de Apache para evitar que se agote el tiempo de espera con su operación de proxy (con un gran factor de derrame en caso de que Tomcat tardara más en devolver una página):

Timeout 5400 ProxyTimeout 5400

Algunos backgound

ProxyTimeout solo no fue suficiente. En cuanto a la documentación de Timeout supongo (no estoy seguro) que esto se deba a que mientras Apache espera una respuesta de Tomcat, no hay tráfico entre Apache y el navegador (o el cliente http), y así Apache cierra la conexión al navegador.

Descubrí que si dejaba la configuración de Tiempo de espera en su valor predeterminado (300 segundos), si la solicitud de proxy a Tomcat tardaba más de 300 segundos en obtener una respuesta, el navegador mostraría una página "Error de proxy 502". Creo que este mensaje es generado por Apache, sabiendo que actúa como un proxy inverso, antes de que cierre la conexión al navegador (esta es mi comprensión actual, puede ser defectuosa).

La página de error de proxy dice:

Error de proxy

El servidor proxy recibió una respuesta no válida de un servidor en sentido ascendente. El servidor proxy no pudo manejar la solicitud GET.

Motivo: Error al leer desde un servidor remoto

... lo que sugiere que es la configuración de ProxyTimeout demasiado corta, mientras que la investigación muestra que la configuración de Tiempo de espera de Apache (tiempo de espera entre Apache y el cliente) también influye en esto.


Supongo que estás usando mod_proxy_http (o proxy balancer).

Mire en sus registros de tomcat (localhost.log, o catalina.log). Sospecho que está viendo una excepción en su pila de la red burbujeando y cerrando el socket al que está conectado el trabajador de tomcat.