Tengo dos servidores Tomcat que necesitan mantener una conexión constante para reducir el protocolo de enlace SSL. Un servidor (el proxy) se encuentra en una zona desmilitarizada, mientras que el otro está seguro detrás de otro servidor de seguridad. El proxy básicamente solo ejecuta un servlet simple que realiza alguna comprobación de cordura antes de reenviar las solicitudes a la máquina segura. En una solicitud inicial, las máquinas intercambian certificados antes de realizar el trabajo real. Por lo tanto, me gustaría mantener una conexión constante con un tiempo de espera de unos minutos.Tomcat, HTTP Keep-Alive y Java's HttpsUrlConnection
Para hablar con el servidor seguro, el servlet en el proxy usa HttpsUrlConnection
. Configuré WireShark y noté que no importa qué valor de keepAliveTimeout
establezca para el conector en la máquina segura, la conexión TCP se cierra después de unos 5 o 10 segundos. Este número parece coincidir con lo que he leído es el tiempo de espera predeterminado y cómo maneja Java HTTP Keep-Alive. Este link explica que Java respeta el tiempo de espera Keep-Alive
si lo envía el servidor, de lo contrario, utiliza 5 segundos (conexiones directas) o 10 segundos (conexiones proxy) antes de que cierre la conexión.
Lo que estoy tratando de averiguar es cómo puedo obligar a Tomcat a enviar el encabezado Keep-Alive. No, Connection: Keep-Alive
, pero Keep-Alive: timeout=x
.
Experimenté con el servidor Apache HTTP y la modificación del keepAliveTimeout
en httpd.conf hace que el encabezado Keep-Alive cambie su valor de tiempo de espera. Además, Java hace honor a este tiempo de espera.
ACTUALIZACIÓN (23/12/11): Después de ejecutar unas cuantas más experimentos que he intentado batir un poco de código de forma rápida y sucia usando Apache HttpClient (3.1) en lugar de HttpsUrlConnection
. Parece que HttpClient, cuando está configurado para usar Keep-Alive, simplemente espera que el servidor cierre la conexión. No sé cuánto tiempo esperará. Estoy disparando para mantener la conexión HTTP activa de 3 a 5 minutos.
"La conexión TCP se cierra después de unos 5 o 10 segundos". ¿Por qué final? El cliente o el servidor? – EJP
Lo cierra el cliente. –
Ya sabe, el escenario que describe; WebServer en las solicitudes de reenvío DMZ a AppServers detrás de un firewall, a menudo se maneja con Apache HTTPD en la DMZ haciendo las cosas https y reenviando las solicitudes a Tomcat AppServers usando conectores AJP (http://tomcat.apache.org/tomcat-4.0). -doc/config/ajp.html). Esta es una forma alternativa de evitar la sobrecarga de SSL. –