Configuración de Nginx para pasar el sitio directamente a tomcat webapp con contexto

tl; versión dr

¿Cómo se configuranginx como un proxy inverso paraexample.com a un local corriendotomcat aplicación web enhttp://127.0.0.1:8080/blah/ sin romper elpageContext?

Configuración de Tomcat

Existe untomcat 7 Aplicación Web,blah, desplegado con un.war archivo y sentado en/var/lib/tomcat7/webapps/blah/.

tomcat se está ejecutando localmente y accesible enhttp://127.0.0.1:8080. Se están ejecutando varias aplicaciones web y se puede acceder a ellas en:

http://127.0.0.1:8080/blah/http://127.0.0.1:8080/foo/http://127.0.0.1:8080/bar/

Puerto8080 Está bloqueado externamente por el firewall.

Configuración de Nginx

nginx se está ejecutando en el servidor como el controlador de acceso. Un sitio está habilitado para acceder a todas las aplicaciones web de tomcat locales mencionadas anteriormente. Esto funciona bien paraexample.com:

server {
listen  80; 
server_name example.com;
root /var/lib/tomcat/webapps/ROOT/;

  location / { 
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080/;
  }
}
Pregunta: cómo configurar un sitio adicional para accederblah ¿directamente?

Debajo/etc/nginx/sites-enabled/ un archivo de sitio adicional está configurado para enrutarhttp://blah.com ahttp://127.0.0.1:8080/blah/ Pero hay problemas.

server {
  listen  80; 
  server_name blah.com *.blah.com;
  root /var/lib/tomcat/webapps/blah/;

  location / { 
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Real-IP          $remote_addr;  
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_pass                          http://127.0.0.1:8080/blah/;
  }
}

Esta configuración añade un extrablah a la ruta de contexto, creando un404 página porque ruta/blah/blah/ No existe, lo que tiene sentido. ¿Hay una manera simple dentro denginx pasarblah.com a la raíz de la aplicación web?

Dentro de la aplicación web, estoy usando${pageContext.request.contextPath}/path para rutas relativas al recurso webapp. Pensé que esta era la forma correcta de manejar las rutas internas de Tomcat, pero ¿podría ser esto parte del problema? Creo que es por eso que estoy recibiendo el extrablah en la ruta, creando el404 página.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="refresh" content="0; url=${pageContext.request.contextPath}/form">
  <script type="text/javascript">
    window.location.href = "${pageContext.request.contextPath}/form"
  </script>
  <title>Load BLAH</title>
</head>
<body>
  <p>If you are not redirected automatically, follow this <a href="${pageContext.request.contextPath}/form">link</a>.</p>
</body>
</html>

Esta página está bien, pero la redirección va a/blah/blah/form en lugar de/blah/form Donde realmente existe el servlet.

También he intentado otros enfoques incluyendo apuntandoblah.com a la propia raíz del gato. Esto funciona en el sentido de que puedes llegar ablah víablah.com/blah/ Pero eso no es realmente lo que queremos.

Además, es completamente aceptable (y deseado) aún poder accederblah víaexample.com/blah/.

Obviamente, esto es para unnginx principiante, pero ayúdeme (y futuros novatos) a aclarar esto porque la solución clara me está eludiendo a mí y alnginx Los docs usan la ayuda también.

Respuestas a la pregunta(4)

Su respuesta a la pregunta