Configuration Nginx pour passer le site directement à l’application Web tomcat avec le contexte

tl; version dr

Comment configurer nginx tant que proxy inverse pour example.com sur une application web tomcat exécutée localement à l’adresse http://127.0.0.1:8080/blah/ sans casser la pageContext ?


Configuration de Tomcat

Il existe une application Web tomcat 7 , blah , déployée avec un fichier .war et située dans /var/lib/tomcat7/webapps/blah/ .

tomcat fonctionne localement et est accessible à l’ http://127.0.0.1:8080 . Plusieurs applications Web sont en cours d’exécution et sont accessibles à 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é à l’extérieur par le pare-feu.

Configuration Nginx

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 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 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 un blah supplémentaire au chemin de contexte, créant une page 404 car path /blah/blah/ n’existe pas, ce qui est logique. Existe-t-il un moyen simple dans nginx de transmettre blah.com à la racine de l’application Web?

Dans l’application Web, j’utilise ${pageContext.request.contextPath}/path pour les chemins relatifs à la ressource Webapp. Je pensais que c’était la bonne façon de gérer les chemins de tomcat internes mais cela pourrait-il faire partie du problème? Je crois que c’est la raison pour laquelle j’obtiens le blah supplémentaire sur la route, créant la page 404 .

        window.location.href = "https://stackoverflow.com/questions/19866203/nginx-configuration-to-pass-site-directly-to-tomcat-webapp-with-context/${pageContext.request.contextPath}/form"  Load BLAH   

If you are not redirected automatically, follow this link.

Cette page est bien reçue 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, notamment le pointage blah.com vers la racine tomcat. 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 souhaitable) de pouvoir toujours accéder à blah via example.com/blah/ .

Évidemment, ceci est pour un novice de nginx mais aidez-moi (et les futurs novices) à clarifier les choses car la solution claire me échappe et les docs de nginx utilisent également cette aide.

Une solution possible consiste à créer un hôte virtuel dans tomcat et à définir blah comme étant l’application ROOT sur le nouvel hôte. nginx transmettra les demandes de tomcat à tomcat sur localhost, y compris l’en-tête de l’hôte demandé et tomcat gérera le rest dans le bon contexte.

Configurer l’hôte virtuel

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

         www.blah.com   
  2. Créez le répertoire appBase $CATALINA_HOME/blahApps/

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

      
  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

Juste les requêtes de proxy pour blah.com à localhost et tomcat prendront en charge le rest:

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

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 installer tomcat7

3) Configurer mon contexte 3.1) – dans / etc / tomcat7 / Catalina / localhost add mi_context_file.xml

  WEB-INF/web.xml 

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 le gestionnaire Tomcat7 et vérifiez les journaux tomcat ou redémarrez votre contexte depuis l’URL du gestionnaire Tomcat.

3.5) Entrez dans votre contexte d’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 

Je pourrais résoudre le même problème avec quelques modifications, alors je laisse le dossier. 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 l’application Web du gestionnaire de tomcat. La guerre est copiée dans /usr/lib/tomcat7 .

Créer un fichier conf 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; } } 

Modifiez le fichier server.xml dans /var/lib/tomcat7/conf

   

Copier le fichier de guerre

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

C’est ça, je n’avais pas besoin d’autre configuration. Dans /var/lib/tomcat7/conf/Catalina , nous avons le répertoire clojure2.example.com. Je pourrais peut-être append plus de configuration dans le répertoire.

Ma façon de régler ceci: similaire aux autres, mais avec quelques différences Système – Ububtu 14.04

1) Créez un hôte virtuel pour l’application. Vous devez append HOST au server.xml dans / etc / tomcat7

       

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 (le port est nécessaire en supposant que tomcat ne fonctionne pas sur le port 80 car ce port – 80 – est écouté par NGINX)

3) Allez dans 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émarrer NGINX