Конфигурация Nginx для передачи сайта непосредственно в tomcat webapp с контекстом
tl; dr версия
Как настроить nginx
как обратный прокси для example.com
на локально выполняемый tomcat
webapp в http://127.0.0.1:8080/blah/
без нарушения pageContext
?
Настройка Tomcat
Существует tomcat 7 webapp, blah
, развернутый с файлом .war
и сидящий в /var/lib/tomcat7/webapps/blah/
.
tomcat
работает локально и доступен в http://127.0.0.1:8080
. Несколько веб-приложений запущены и могут быть доступны по адресу:
-
http://127.0.0.1:8080/blah/
-
http://127.0.0.1:8080/foo/
-
http://127.0.0.1:8080/bar/
Порт 8080
заблокирован внешним файерволом.
Настройка Nginx
nginx
работает на сервере в качестве гейткипера. Один сайт имеет доступ ко всем локальным веб-сайтам tomcat, упомянутым выше. Это отлично работает для 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
?
В /etc/nginx/sites-enabled/
добавлен дополнительный файл сайта для маршрутизации http://blah.com
в http://127.0.0.1:8080/blah/
, но есть проблемы.
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/;
}
}
Эта настройка добавляет дополнительный blah
к пути контекста, создавая страницу 404
, потому что путь /blah/blah/
не существует, что имеет смысл. Есть ли простой способ в пределах nginx
передать blah.com
корню webapp?
Внутри webapp я использую ${pageContext.request.contextPath}/path
для относительных путей к ресурсу webapp. Я думал, что это правильный способ обработки внутренних путей tomcat, но может ли это быть частью проблемы? Я считаю, что именно поэтому я получаю дополнительные blah
на маршруте, создавая страницу 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>
Эта страница удалась, но перенаправление переходит в /blah/blah/form
вместо /blah/form
, где сервлет действительно существует.
Я также пробовал другие подходы, включая указание blah.com
на корень tomcat. Это работает в том смысле, что вы можете добраться до blah
через blah.com/blah/
, но это не совсем то, что мы хотим.
Кроме того, вполне приемлемо (и желательно), чтобы все еще иметь доступ к blah
через example.com/blah/
.
Очевидно, что это для новичков nginx
, но помогите мне (и будущим новичкам) очистить это, потому что ясное решение ускользает от меня, а документы nginx
также используют эту помощь.
Ответы
Ответ 1
Одним из возможных решений является создать виртуальный хост внутри tomcat
и установить blah
в качестве приложения ROOT
на новый хост. nginx
будет передавать все запросы на передачу tomcat
на локальном хосте, включая запрошенный заголовок хоста, а tomcat будет обрабатывать остальные с правильным контекстом.
Настройка виртуального хоста
-
Добавьте запись Host
в Engine
часть $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>
-
Создайте каталог appBase
$CATALINA_HOME/blahApps/
-
Настройте context
на $CATALINA_HOME/blahApps/ROOT/META-INF/context.xml
<Context path="/"
antiResourceLocking="false" />
-
Разверните blah
до $CATALINA_HOME/blahApps/ROOT
. Это может быть так же просто, как изменить blah.war
на ROOT.war
.
Удостоверьтесь, что nginx
по-прежнему является кокасическим
Просто запросы прокси для blah.com
на localhost и tomcat
будут заботиться обо всем остальном:
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;
}
}
Ответ 2
Эта работа для меня:
Окружающая среда:
- Amazon AWS
- Ubuntu 14.04 TLS/64 Bits
- Nginx
- Tomcat 7
- Oracle JDK 1.7
Шаги:
1) Установите Oracle JDK
http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html
2) aptitude install tomcat7
3) Настройте мой контекст
3.1) - в /etc/tomcat 7/Catalina/localhost добавить 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) создайте папку моего сайта и извлеките мой контекст
3.3) Добавьте эти строки для настройки 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) Перезапустите nginx и tomcat7. Если ваш контекст не запустится, войдите в диспетчер Tomcat7 и проверьте журналы tomcat или перезапустите свой контекст из url менеджера tomcat.
3.5) Введите в свой контекст приложения tomcat:
http://yoursite/MiContext
4) Ссылки 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
Ответ 3
Я мог бы решить ту же проблему с некоторыми изменениями, поэтому я оставляю запись.
Я использую Ubuntu 14.04, я установил tomcat с sudo apt-get install tomcat7
.
У меня уже есть файл war-demo.war, сгенерированный с помощью lein (clojure), и установлен (загружен) из tomcat manager webapp. Война копируется в /usr/lib/tomcat7
.
Сделать файл conf для 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;
}
}
Измените server.xml в /var/lib/tomcat7/conf
<Host name="clojure2.example.com" appBase="wardemo"
unpackWARS="true" autoDeploy="true">
</Host>
Копировать файл войны
- Создайте каталог wardemo в каталоге `/var/lib/tomcat7
- Скопируйте war-demo.war в каталог wardemo как ROOT.war
Чтобы это, мне не нужна другая конфигурация. В /var/lib/tomcat7/conf/Catalina
у нас есть каталог clojure2.example.com. Возможно, я смогу добавить еще одну конфигурацию в каталог.
Ответ 4
Мой способ настроить это: аналогично другим, но с некоторыми отличиями
Система - Ububtu 14.04
1) Создайте виртуальный хост для приложения. Вам нужно добавить HOST на server.xml в /etc/tomcat 7
<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) Поместите приложение в папку "webapps" в каталоге /var/lib/tomcat 7
3) Запустите tomcat - после этого вы сможете посетить свое приложение локально, введя yourapp.com:8080 (требуется порт, если предполагается, что tomcat работает не на 80-порте, так как этот порт - 80 - прослушивается NGINX)
3) Перейдите в конфигурацию Nginx и поместите туда следующие строки
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) Перезапустите NGINX