Назад | Перейти на главную страницу

Обратный прокси Nginx для Tomcat

Я установил сервер Ubuntu 15.10 x64 в DigitalOcean для тестирования нескольких приложений Java. Я установил Nginx 1.9.3 и Tomcat8 и использую Nginx в качестве обратного прокси для пересылки всех запросов Tomcat на порт 8080.

Здесь все становится рискованно. Я запускаю два приложения в моей установке tomcat, / webapp1 и / webapp2. Я хочу указать subdomain.domain.com на / webapp1 и subdomain2.domain.com на / webapp2. В Apache это довольно простое дело с использованием mod_proxy, но с Nginx это немного более загадочно.

Вот что я пробовал в моем файле sites-enable / domain.

1-й раунд

server{
   server_name subdomain1.domain.com;
   # ******************SSL configuration ************************
   listen 443 ssl default_server;
   ssl_certificate /etc/nginx/conf/ssl/domain.crt;
   ssl_certificate_key /etc/nginx/conf/ssl/domain.key;
   #*********************************************************************

   #**********Proxy**********************
   location / {

   proxy_redirect off;
   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://subdomain1.domain.com:8080/webapp1/;
}

Запросы работали, когда я обращался https://subdomain1.domain.com но любые ссылки в моем приложении, которые ссылались на контекстный путь, например / webapp1 /, привели к URL-адресу, который содержал два контекстных пути, например https://subdomain1.domain.com/webapp1/webapp1/. Это приводило к разного рода неработающим ссылкам и т. Д.

2-й раунд Я нашел поток, в котором обсуждалась аналогичная проблема, и исправление заключалось в использовании перезаписи для удаления дополнительного пути контекста из URL-адреса.

server{
       server_name subdomain1.domain.com;
       # ******************SSL configuration ************************
       listen 443 ssl default_server;
       ssl_certificate /etc/nginx/conf/ssl/domain.crt;
       ssl_certificate_key /etc/nginx/conf/ssl/domain.key;
       #*********************************************************************

       #**********Proxy**********************
       location / {

       proxy_redirect off;
       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://subdomain1.domain.com:8080/webapp1/;
       rewrite ^/webapp1/(.*)$ /$1 last;
    }

Это разрешило мою проблему с двойным контекстным путем в URL-адресе и пока будет работать, но мне интересно, есть ли более элегантное решение, в котором не требуется перезапись. Я сомневаюсь, что перезапись обходится дорого с точки зрения ресурсов сервера, но что-то в этом мне не нравится.

Заранее благодарю за ваше время.

Обновить

С тех пор я читал о конфигурации местоположений. Вот еще одна конфигурация, которая разрешает двойной контекстный путь в URL-адресе и позволяет избежать использования перезаписи. По сути, nginx использует обе конфигурации местоположения, поэтому, когда uri имеет двойной путь контекста, например https://subomdain1.domain.com/webapp1/webapp1/, он подбирает его во втором блоке местоположения и пересылает на мой сервер tomcat, но без первого пути контекста. Я не уверен, что это решение или решение для перезаписи более элегантно.

     server{
           server_name subdomain1.domain.com;
           # ******************SSL configuration ************************
           listen 443 ssl default_server;
           ssl_certificate /etc/nginx/conf/ssl/domain.crt;
           ssl_certificate_key /etc/nginx/conf/ssl/domain.key;
           #*********************************************************************

           #**********Proxy**********************
           location / {

           proxy_redirect off;
           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://subdomain1.domain.com:8080/webapp1/;
           #rewrite ^/webapp1/(.*)$ /$1 last;
        }
           location /webapp1/ {

           proxy_redirect off;
           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://subdomain1.domain.com:8080/webapp1/;
        }
    }