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
также используют эту помощь.