Configuration Nginx pour passer le site directement à tomcat webapp avec contexte

tl; dr version

Comment avez-vous d'installation nginx comme un proxy inverse pour example.com locale running tomcat webapp http://127.0.0.1:8080/blah/ sans briser le <!--7?


Tomcat Setup

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

tomcat fonctionne localement et accessible à http://127.0.0.1:8080. Plusieurs webapps sont en cours d'exécution et peuvent être consultés à:

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

Port 8080 est bloqué extérieurement par le pare-feu.

Nginx Setup

nginx s'exécute sur le serveur en tant que gatekeeper. Un site est activé pour accéder à toutes les applications web locales tomcat mentionnées ci-dessus. Cela fonctionne très 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 y accéder blah directement?

/etc/nginx/sites-enabled/ un fichier de site supplémentaire est mis en place pour la route http://blah.comhttp://127.0.0.1:8080/blah/ mais il y a 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 unblah au chemin du contexte, créant un 404 page parce que le chemin d'accès /blah/blah/ n'existe pas, ce qui est logique. Y a-t-il un moyen simple à l'intérieur de nginx pour pass blah.com à la racine webapp?

dans le webapp, j'utilise ${pageContext.request.contextPath}/path pour les chemins relatifs à la ressource webapp. Je pensais que c'était l' bonne façon de gérer les chemins tomcat internes, mais cela pourrait-il faire partie du problème? Je crois que c'est la raison pour laquelle je reçois le supplément blah dans la route, créant le 404 page.

<%@ 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 activée alright mais la redirection va à /blah/blah/form au lieu de /blah/form où le servlet existe réellement.


j'ai également essayé d'autres approches, y compris le pointage blah.com à la racine de tomcat. Cela fonctionne dans le sens où vous pouvez obtenir blah par blah.com/blah/ mais c'est pas vraiment ce que nous voulons.

de plus, il est tout à fait acceptable (et souhaité) d'être encore en mesure d'accéder blah par example.com/blah/.

Évidemment, c'est pour un nginx novice, mais pour m'aider (et novices) ceci parce que la solution évidente est d'éluder moi et l' nginx docs utiliser l'aide aussi.

22
demandé sur bnjmn 2013-11-08 22:36:09

4 réponses

une solution possible est decréer un virtual host à l'intérieur de tomcat et définissez blahROOT app sur le nouvel hôte. nginx va passer encore passer les demandes d' tomcat sur localhost y compris l'en-tête hôte demandé et tomcat traitera le reste avec le contexte correct.

configurer L'hôte virtuel

  1. Ajouter un Host entrée Engine partie 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éer appBase répertoire $CATALINA_HOME/blahApps/

  3. Configurer le context$CATALINA_HOME/blahApps/ROOT/META-INF/context.xml

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

assurez-vous que nginx est encore copacetic

Juste des demandes de proxy pour blah.com localhost tomcat va prendre soin de la repos:

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;
  }
}
29
répondu bnjmn 2013-11-12 05:50:36

Ce Travail pour moi:

Environnement:

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

Mesures:

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 ajouter 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 à setup 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 vérifiez les journaux tomcat ou redémarrez votre contexte à partir de l'url tomcat manager.

3.5) entrez dans le contexte de votre application tomcat:

http://yoursite/MiContext

4) Nginx références:

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
répondu Luis Morales 2015-01-11 01:19:11

je pourrais résoudre le même problème avec quelques modifications, donc je laisse le dossier. J'utilise Ubuntu 14.04, j'ai installé tomcat avec sudo apt-get install tomcat7.

j'ai déjà une guerre de démonstration.la guerre de fichier généré avec lein (clojure application), et installé (chargé) à partir de tomcat manager webapp. La guerre est copié dans /usr/lib/tomcat7.

créer un fichier conf de 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 serveur.xml /var/lib/tomcat7/conf

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

guerre de la copie le fichier

  1. Créer un wardemo-répertoire dans le répertoire `/var/lib/tomcat7
  2. copiez la war-demo.la guerre dans le wardemo répertoire RACINE.la guerre

c'est ça, je n'ai pas besoin de configuration. /var/lib/tomcat7/conf/Catalina, nous avons clojure2.example.com répertoire. Je peux peut-être ajouter plus de configuration dans le répertoire.

0
répondu prosseek 2015-11-12 00:48:37

ma façon de l'accorder: semblable aux autres, mais avec quelques différences Le Système Ububtu 14.04

1) Créer un hôte virtuel pour l'application. Vous devez ajouter HOST au serveur.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>

3) Démarrer tomcat - après cela, vous serez en mesure de visiter votre application en entrant yourapp.com: 8080 (port est nécessaire en supposant que tomcat ne fonctionne pas sur 80 port comme ce port - 80-est écoutée 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;
 }
}
0
répondu Andrew Gans 2016-02-19 14:09:44