¿Cómo consigo que tomcat 5.5 se ejecute detrás de apache 2 con mod_rewrite pasando las solicitudes a mod_jk y eliminando el contexto de la aplicación?

StackOverflow https://stackoverflow.com/questions/208261

Pregunta

Bien, quiero que una aplicación web se ejecute en tomcat (5.5) para ejecutarse detrás de apache 2 (2.2.3 para ser precisos) desde la raíz del sitio (es decir, sin el contexto), con contenido estático servido a través de apache.

Entonces, si la aplicación se ejecuta bajo " / myapp " en Tomcat quiero usar apache (más mod_rewrite ) para hacer que se comporte como si se estuviera ejecutando bajo " / " en su lugar.

Mod_jk está configurado y funciona bien. Puedo acceder a la aplicación desde " / myapp " ;, pero no consigo que el último bit funcione. A continuación se muestra la configuración que tengo para mod_rewrite para intentar que esto funcione. Obtiene correctamente las direcciones de reescritura / static / para que Apache les sirva desde la aplicación web desempaquetada y si habilito el registro de reescritura, veo que intenta pasar todas las demás solicitudes a / myapp a través de mod_jk . Sin embargo, parece que mod_jk no está procesando la solicitud posteriormente.


JkMount /myapp/*      worker1

RewriteEngine On

# ensure static stuff gets served by apache
RewriteRule ^/static/(.*)$ /var/lib/tomcat5.5/webapps/myapp/static/$1 [L]
# everything else should go through tomcat
RewriteRule ^/(.*)$ /myapp/$1 [L,PT]

Cuando he hecho esto con apache 1 en el pasado, he tenido que asegurarme de que mod_jk se cargue antes de mod_rewrite , pero parece que no puedo lograrlo esta bajo apache 2. ¿Algún pensamiento? ¿Cómo suelen hacer esto otras personas?

¿Fue útil?

Solución

Logró que esto funcionara al final. Parece que necesito configurar un JkOption para:


JkOptions     +ForwardURICompat

Y luego mod_jk mira la URL reescrita. Debo admitir que no estoy 100% seguro de por qué funciona esto, pero creo que está volviendo a una forma de comportamiento más antigua. Si alguien me puede decir una forma mejor / más correcta de hacer esto, me encantaría saberlo.

Otros consejos

Puede ser mejor usar Apache para proxy en lugar de mod_jk. Algo como esto:

ProxyPass / static / http: // localhost: 8080 / myapp / static /

Puede ser más fácil o más transparente lo que sucede si usa Tomcat Virtual Hosts o diferentes conectores para diferentes hosts y simplemente implementa aplicaciones raíz (en " / ") y configura el reenvío de Apache mod_jk a los diferentes conectores o hosts virtuales. .

Nota: cuando lo necesitaba, he trabajado con diferentes conectores para diferentes hosts o motores Tomcat (no recuerdo) y he implementado aplicaciones ROOT. Nunca he intentado hosts virtuales (basados ??en el nombre) en Tomcat, solo adivinando que esto podría funcionar.

Beneficio: no hay traducción de rutas, por lo tanto, mucho más fácil de entender una vez que tenga que hacer cambios en la instalación meses después de la implementación inicial.

Confieso que se siente algo extraño, pero el beneficio de la legibilidad vale mucho para mí.

Usamos la bandera 'R' en lugar de 'PT':

RewriteRule ^/(.*)$ /myapp/$1 [L,R]

Editar: Me perdí el punto de no alterar la URL que el usuario ve. Una forma alternativa es hacerlo:

JkMount /* worker1
JkUnmount /static/* worker1

Entonces no necesitarás la RewriteRule's.

Y de acuerdo con Sitio de Apache Tomcat la nueva configuración predeterminada del mod_jk son incompatibles con mod_rewrite y debe usar + ForwardURICompatUnparsed .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top