Configuração do Nginx para passar o site diretamente para o webcat do tomcat com contexto

tl; versão dr

Como você configuranginx como um proxy reverso paraexample.com para um funcionamento localtomcat webapp emhttp://127.0.0.1:8080/blah/ sem quebrar opageContext?

Configuração do Tomcat

Existe umTomcat 7 aplicativo web,blah, implantado com um.war arquivo e sentado em/var/lib/tomcat7/webapps/blah/.

tomcat está sendo executado localmente e acessível emhttp://127.0.0.1:8080. Várias aplicações web estão em execução e podem ser acessadas em:

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

Porta8080 está bloqueado externamente pelo firewall.

Configuração Nginx

nginx está sendo executado no servidor como o gatekeeper. Um site está habilitado para acessar todos os webapps do tomcat local mencionados acima. Isso funciona bem 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/;
  }
}
Pergunta: como configurar um site adicional para acessarblah diretamente?

Debaixo/etc/nginx/sites-enabled/ um arquivo de site adicional está configurado para rotearhttp://blah.com parahttp://127.0.0.1:8080/blah/ mas há 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 configuração adiciona um extrablah para o caminho do contexto, criando um404 página porque caminho/blah/blah/ não existe, o que faz sentido. Existe uma maneira simples dentronginx passarblah.com para a raiz do webapp?

Dentro do webapp, estou usando${pageContext.request.contextPath}/path para caminhos relativos ao recurso webapp. Eu pensei que esta era a maneira correta de lidar com os caminhos internos do Tomcat, mas isso poderia ser parte do problema? Eu acredito que é por isso que estou recebendo o extrablah na rota, criando o404 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 foi atingida, mas o redirecionamento vai para/blah/blah/form ao invés de/blah/form onde o servlet realmente existe.

Eu também tentei outras abordagens, incluindo apontandoblah.com para a própria raiz do tomcat. Isso funciona no sentido de que você pode chegar ablah através dablah.com/blah/ mas isso não é realmente o que queremos.

Além disso, é completamente aceitável (e desejado) ainda poder acessarblah através daexample.com/blah/.

Obviamente, isso é para umnginx novato, mas ajude-me (e futuros novatos) a esclarecer isso porque a solução clara está me iludindo eonginx docs também usam a ajuda.

questionAnswers(4)

yourAnswerToTheQuestion