web-dev-qa-db-fra.com

Configuration de Nginx pour transmettre le site directement à l'application Web Tomcat avec contexte

tl; dr version

Comment configurez-vous nginx en tant que proxy inverse pour example.com dans une __application Tomcat locale exécutée localement à http://127.0.0.1:8080/blah/ sans rompre la pageContext?


Configuration de Tomcat

Il existe un Tomcat 7 webapp, blah, déployé avec un fichier .war et assis dans /var/lib/Tomcat7/webapps/blah/

Tomcat s'exécute localement et est accessible à http://127.0.0.1:8080. Plusieurs applications Web sont en cours d'exécution et peuvent être consultées à l'adresse suivante:

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

Le port 8080 est bloqué de manière externe par le pare-feu.

Configuration de Nginx

nginx s'exécute sur le serveur en tant que portier. Un site est activé pour accéder à toutes les applications Web Tomcat locales mentionnées ci-dessus. Cela fonctionne bien pour example.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/;
  }
}

Question: comment configurer un site supplémentaire pour accéder directement à blah?

Sous /etc/nginx/sites-enabled/, un fichier de site supplémentaire est configuré pour router http://blah.com vers http://127.0.0.1:8080/blah/, mais il existe des problèmes.

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/;
  }
}

Cette configuration ajoute une variable blah supplémentaire au chemin de contexte, créant une page 404 car le chemin /blah/blah/ n'existe pas, ce qui est logique. Existe-t-il un moyen simple dans nginx de Transmettre blah.com à la racine de la Webapp? 

Dans l'application Web, j'utilise ${pageContext.request.contextPath}/path pour les chemins d'accès relatifs aux ressources d'applications Web. Je pensais que c'était la bonne façon de gérer les chemins internes de Tomcat, mais est-ce que cela pourrait faire partie du problème? Je crois que c’est la raison pour laquelle je reçois la variable supplémentaire blah dans la route, créant ainsi la page 404.

<%@ 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>

Cette page est consultée mais la redirection passe à /blah/blah/form au lieu de /blah/form où le servlet existe réellement.


J'ai également essayé d'autres approches, notamment en pointant blah.com sur la racine Tomcat elle-même. Cela fonctionne dans le sens où vous pouvez accéder à blah via blah.com/blah/ mais ce n'est pas vraiment ce que nous voulons.

De plus, il est tout à fait acceptable (et souhaité) de pouvoir toujours accéder à blah via example.com/blah/.

Évidemment, ceci est pour un novice nginx mais aidez-moi (ainsi que les futurs novices) à clarifier cela, car la solution claire m’échappe et les documents nginx utilisent aussi l’aide.

24
bnjmn

Une solution possible consiste à créer un hôte virtuel dans Tomcat et définir blah comme application ROOT sur le nouvel hôte. nginx continuera à transmettre les demandes à Tomcat sur localhost, y compris l'en-tête de l'hôte demandé, et Tomcat traitera le reste avec le contexte correct.

Configurer l'hôte virtuel

  1. Ajoutez une entrée Host à la partie Engine de $CATALINA_HOME/conf/server.xml

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
      </Host>
      <Host name="blah.com" appBase="blahApps" 
          unpackWARS="true" autoDeploy="true">
          <Alias>www.blah.com</Alias>
      </Host>
    </Engine>
    
  2. Créez le répertoire appBase$CATALINA_HOME/blahApps/

  3. Configurez la context avec $CATALINA_HOME/blahApps/ROOT/META-INF/context.xml

    <Context path="/" 
        antiResourceLocking="false" />
    
  4. Déployez blah sur $CATALINA_HOME/blahApps/ROOT. Cela peut être aussi simple que de changer blah.war en ROOT.war.

Assurez-vous que nginx est toujours copacétique

Seules les requêtes proxy de blah.com à localhost et de Tomcat se chargeront du reste:

server {
  listen  80; 
  server_name blah.com www.blah.com;

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

Ce travail pour moi:

Environnement:

  • Amazon AWS 
  • Ubuntu 14.04 TLS/64 Bits 
  • Nginx
  • Tomcat 7
  • Oracle JDK 1.7

Pas:

1) Installer Oracle JDK 

http://www.webupd8.org/2012/01/install-Oracle-Java-jdk-7-in-ubuntu-via.html

2) aptitude install Tomcat7 

3) Configurer mon contexte 3.1) - dans/etc/Tomcat7/Catalina/localhost add mi_context_file.xml

<Context path="/MyContext" docBase="local_path_to_my_context_files" privileged="true" reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>

3.2) créer mon dossier de site et extraire mon contexte

3.3) Ajoutez ces lignes pour configurer my_site:

server {
   listen   80;
   server_name my_site;
   #
   access_log /my_site_log/access-timed-combined.log timed_combined;
   error_log  /my_site_log/error.log;
   #
   root   /my_site_folder;
   index  index.html index.jsp;
   #
   location @MyContext {
      sendfile off;
      proxy_pass         http://127.0.0.1:8080;
      proxy_redirect     default;

      proxy_set_header   Host             $Host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;

      proxy_buffer_size          4k;
      proxy_buffers              4 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;
   }
   #
   location ~ "^/MyContext/*" {
      try_files $uri @MyContext;
   }
}

3.4) Redémarrez nginx et Tomcat7. Si votre contexte ne démarre pas, entrez dans Tomcat7 manager et consultez les journaux Tomcat ou redémarrez votre contexte à partir de l'URL du gestionnaire Tomcat.

3.5) Entrez dans le contexte de votre application Tomcat: 

http://yoursite/MiContext

4) Références Nginx:

Running Jenkins behind Nginx
https://wiki.jenkins-ci.org/display/JENKINS/Running+Jenkins+behind+Nginx

Load Balancing Apache Tomcat with nginx
http://blogs.mulesoft.org/load-balancing-Apache-Tomcat-with-nginx/

Nginx + Apache Tomcat Configuration Example
http://www.mkyong.com/nginx/nginx-Apache-Tomcat-configuration-example/

Configuring Nginx for Apache Tomcat 7
http://blog.rezajp.info/posts/configuring-nginx-for-Apache-Tomcat-7/

Install Tomcat with Nginx on Ubuntu 13.04 (Server)
http://www.laurii.info/2013/10/install-Tomcat-nginx-ubuntu-server-13-04/

Nginx - Java servers like Jetty, GlassFish and Tomcat
http://wiki.nginx.org/JavaServers

Nginx - JavaHandler
http://wiki.nginx.org/JavaHandler

Virtual Host + Nginx + Tomcat
http://www.javacodegeeks.com/2013/02/virtual-Host-nginx-Tomcat.html
5
Luis Morales

Ma façon de régler ceci en: semblable à d’autres, mais avec quelques différences System - Ububtu 14.04

1) Créer un hôte virtuel pour l'application. Vous devez ajouter l'hôte au fichier server.xml dans/etc/Tomcat7.

    <Host name="yourapp.com" appBase="webapps/yourapp" unpackWars="true" autoDeploy="true">
          <Logger className="org.Apache.catalina.logger.FileLogger" directory="logs" prefix="virtual_log." suffix=".txt" timestamp="true" />
           <Context path="" docBase="path to your war" debug="0" reloadable="true" />
         <Valve className="org.Apache.catalina.valves.AccessLogValve" directory="logs" prefix="virtual_log." suffix=".txt" pattern="common" />
  </Host>

2) Placez votre application dans le dossier "webapps" de/var/lib/Tomcat7.

3) Démarrez Tomcat - après cela, vous pourrez visiter votre application localement en entrant yourapp.com:8080 (un port est nécessaire en supposant que Tomcat ne fonctionne pas sur le port 80 car ce port - 80 - est actuellement écouté par NGINX).

3) Allez à la configuration de Nginx et placez-y les lignes suivantes 

server {
  listen  80; 
  server_name yourapp.com;
  root            /var/lib/Tomcat7/webapps/yourapp

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

server {
  listen  80; 
  server_name rootapp.com; # this is app that is ROOT
  root            /var/lib/Tomcat7/webapps

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

4) Redémarrez NGINX

0
Andrew Gans

Je pourrais résoudre le même problème avec quelques modifications, alors je laisse le compte rendu. J'utilise Ubuntu 14.04, j'ai installé Tomcat avec Sudo apt-get install Tomcat7.

J'ai déjà un fichier war-demo.war généré avec lein (application clojure) et installé (chargé) à partir de la Webapp du gestionnaire de Tomcat. La guerre est copiée dans /usr/lib/Tomcat7.

Faire un fichier de configuration pour nginx

server {
    listen  80; 
    server_name clojure2.example.com;

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

Modifier le fichier server.xml dans /var/lib/Tomcat7/conf

<Host name="clojure2.example.com" appBase="wardemo"                                                                   
    unpackWARS="true" autoDeploy="true">                                                                               
</Host> 

Copier le fichier de guerre

  1. Créez un répertoire wardemo dans `/ var/lib/Tomcat7
  2. Copiez le fichier war-demo.war dans le répertoire wardemo en tant que ROOT.war.

Ça y est, je n'ai pas besoin d'une autre configuration. Dans /var/lib/Tomcat7/conf/Catalina, nous avons le répertoire clojure2.example.com. Je pourrais peut-être ajouter plus de configuration dans le répertoire. 

0
prosseek