Подтвердить что ты не робот

Конфигурация 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 также используют эту помощь.

4b9b3361

Ответ 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