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
?
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.
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/;
}
}
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.
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.
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>
Créez le répertoire appBase
$CATALINA_HOME/blahApps/
Configurez la context
avec $CATALINA_HOME/blahApps/ROOT/META-INF/context.xml
<Context path="/"
antiResourceLocking="false" />
Déployez blah
sur $CATALINA_HOME/blahApps/ROOT
. Cela peut être aussi simple que de changer blah.war
en ROOT.war
.
nginx
est toujours copacétiqueSeules 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;
}
}
Ce travail pour moi:
Environnement:
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
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
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
.
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;
}
}
/var/lib/Tomcat7/conf
<Host name="clojure2.example.com" appBase="wardemo"
unpackWARS="true" autoDeploy="true">
</Host>
Ç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.