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

Nginx как прокси для tomcat с подкаталогом

Я хочу настроить прокси Nginx для сервера Tomcat с моим доменным именем, например

example.com/demo/sample
example.com/demo/manager
example.com/demo/other_apps
...

Вот мой Nginx server block конфигурация

server {
        listen   80;

        server_name example.com;

        location /demo/ {

        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_set_header Host $host;
        proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/;

        }

        location ~ /\.ht {
                deny all;
        }

## Only allow these request methods ##
     if ($request_method !~ ^(GET|HEAD|POST)$ ) {
         return 444;
     }
## Do not accept DELETE, SEARCH and other methods ##

}

Здесь я столкнулся с двумя проблемами:

Первая проблема:

если TOM_CAT_INSTALL_DIR/webapps/sample/ содержит статическую страницу hello.jsp, он работает с URL:

example.com/demo/app1/

но не работает с URL:

example.com/demo/app1

Почему я должен добавить косую черту в конце / в конце URL-адреса, чтобы прокси nginx работал?


Вторая проблема:

Если TOM_CAT_INSTALL_DIR/webapps/manager содержит index.jsp файл, который является динамической веб-страницей, он не работает с URL

example.com/demo/manager/

URL становится

example.com/manager / ....

Далее следует длинный список параметров.

если я добавлю вручную /demo/ в URL-адрес веб-браузера, он снова работает.

Как сделать так, чтобы прокси nginx работал с подкаталогом /demo/?

Обновить: Я обнаружил, что отсутствующая проблема перезаписи для подкаталога Tomcat Manager заключается в том, что в файле index.jsp request.getContextPath() НЕ будет автоматически добавлять / demo / subdirecotry в URL-адрес. Похоже, нам нужно вручную изменить код файла .jsp.

Если вы не знаете, как изменить код jsp, как я, вы можете обойти это, используя приведенный ниже код в Nginx.

# Must add the trailing '/' for both location and proxy_pass
 location /demo/ {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_pass http://TOM_CAT_SERVER_IP_ADDR:8080/;
        }

# ONLY work for manager apps, for other apps, 
# You must add more rewrite rules like the below
        location /manager/ {
                rewrite ^/(.*)$ /demo/$1 last;
        }

Я думаю ты что-то добавил / дополнительно в настройках конфигурации ...

Посмотрите на эту строку:

proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/;

вам нужно удалить завершающую косую черту, и она должна работать нормально.

как это:

proxy_pass http://IP_ADD_TOMCAT_SERVER:8080;

попробуйте и посмотрите, все ли пойдет хорошо !!

Обновление # 1 Я только что заметил, что у вас есть очередная ошибка "та же опечатка" в вашем location /

удалите вторую косую черту, и все должно работать нормально !!

как это : location /demo { вместо этого location /demo/ {

Обновление №1: вы можете проверить свой URL с помощью этого

$ curl -I http://yoururl.com

и посмотрите, какой результат вам даст. таким образом вы узнаете, работает он или нет.

Обновление № 3:

ваша настройка для работы с любыми .jsp расширение должно иметь этот код в вашем vhost:

location ~ \.jsp$ {
    proxy_pass              http://localhost:8080;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        Host $http_host;
  }

также получить /demo для работы вам нужно добавить код перезаписи ниже server_name example.com

rewrite ^/(.*)$ /demo/$1;

Мое дело http: // localhost: 8080 / демонстрация первая страница работает, но изображение и другие компоненты не поступают с сервера Поэтому я добавляю следующее сопоставление

server {
    listen       80;
    listen       [::]:80;
    server_name  www.example.org example.org;

    #remove /demo if it come to URI otherwise it add two time for call proxy
    rewrite ^/demo(.*)$ $1;
    rewrite ^/(.*)$ /demo/$1;

    location / {
       proxy_pass              http://localhost:8080;
       proxy_set_header        X-Real-IP $remote_addr;
       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header        Host $http_host;
   }
  }