Я установил сервер 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/;
}
}