He tenido algunas dificultades para que lo siguiente funcione en Apache:
Tenemos una instancia de Apache/Tomcat detrás de un AWS ELB. ELB está realizando la terminación de SSL, por lo que tenemos una redirección en el servidor para manejar esto.
Necesito /health
estar disponible en http para que funcione la verificación de estado de ELB.
Necesito enviar todo lo que no lo es /
o theme
a Tomcat, es decir, /foo
servidores proxy a localhost:8080/foo
.
Probé algunas variaciones de la siguiente configuración usando mod_proxy y/o mod_rewrite, pero parece que no puedo hacer que esto funcione correctamente, por lo que agradecería cualquier sugerencia.
<Location /health>
ProxyPass http://localhost:8080/health ttl=1
ProxyPassReverse http://localhost:8080/health
</Location>
<Location ~ "^/(.+)">
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteCond %{REQUEST_URI} !^/(health|theme)/
RewriteRule . http://localhost:8080/$1 [P]
ProxyPassReverse http://localhost:8080/$1
</Location>
<Location />
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/health
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</Location>
Tomcat escucha en el puerto 8080 usando http simple.
Respuesta1
Tengo Tomcat escuchando ajp en el puerto 8009. Aparte de otras ventajas, esto permite definir los mismos hosts virtuales en las configuraciones de ambos servidores, por lo que las solicitudes (que por defecto son el puerto 80) llegan primero a Apache, donde tengo varios servidores virtuales. hosts definidos. Las reglas de proxy inverso luego deciden qué solicitudes reenviar a otros hosts (ya sean hosts virtuales remotos u otros locales), servir contenido desde DocumentRoot o reenviar a Tomcat a través de ajp. Cuando mod_proxy_ajp reenvía solicitudes a Tomcat, de forma predeterminada mantienen sus nombres de host, lo que permite a Tomcat dirigirlas a diferentes aplicaciones web con nombres de host virtuales coincidentes que he definido en server.xml.
Los siguientes ejemplos no hacen exactamente lo que ha descrito, pero espero que muestren la flexibilidad disponible con los hosts virtuales en ambas configuraciones de servidor y le permitan crear configuraciones que satisfagan sus necesidades.
/etc/apache2/extra/vhosts.conf
<VirtualHost *:80>
ServerName my.local.website.com
<Proxy *>
Require all granted
</Proxy>
# proxy specific paths to other virtual hosts
ProxyPass /articles http://a.local.website.com/articles
ProxyPassReverse /articles http://a.local.website.com/articles
ProxyPass /entertainment http://b.local.website.com/entertainment
ProxyPassReverse /entertainment http://b.local.website.com/entertainment
# send everything else to tomcat via ajp on port 8009
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
$CATALINA_HOME/servidor.xml
<Host name="my.local.website.com" appBase="temp" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="website_access." suffix=".log" pattern="common"/>
</Host>