Как установить контекстный путь в Tomcat, чтобы можно было войти на сайт без добавления имени развернутой папки?

Я читал об этом в путеводителе Tomcat здесь и некоторые вопросы SO. И я думаю, что я в значительной степени делаю то же самое. Но каким-то образом добиться успеха не удастся.

Прежде всего, я должен сказать, что мое приложение развернуто на общем сервере Tomcat, на котором я не контролирую. Я просто отбрасываю свой .war файл и развертывается.

Я пытался упаковать свое приложение как ROOT.war, но не работал. Администратор сказал мне, чтобы он упаковал его как любое имя, которое я хочу, и они позаботятся об этом. Я упаковал его как my-application.war, и он развернулся, но мне нужно ввести http://my-host/my-application, чтобы попасть на сайт.

После обращения к администратору они сказали мне, что они установили элемент контекста в моем хосте в файле конфигурации Tomcat, например:

<Context path="" docBase="path of my-application deployed folder"/>

который должен был установить my-application как приложение по умолчанию для всех запросов, поступающих на my-host. Но это не так, и когда я вхожу в http://my-host, я получаю:

HTTP Status 404 - / The requested resource (/) is not available

Но опять же, когда я вхожу в http://my-host/my-application, все работает отлично. Любое предложение о том, что может быть неправильно, безусловно, ценится.

Обновление:
Я попытался выполнить шаги, описанные в документации tomcat, в как сделать приложение по умолчанию. Описаны 3 способа, и я пробовал все три способа и мог успешно развернуть мое приложение как ROOT на localhost.

Я также попытался воспроизвести проблему, с которой я столкнулся на удаленном сервере, чтобы найти причину и сообщить об этом администратору. Я нахожу пару проблем.

  • В фрагменте server.xml, который отправил мне admin, autoDeploy и deployOnStartUp установлены в true, тогда как они должны быть ложными, если явно указывать элемент Context в server.xml. Это приведет к двойному развертыванию, которое создает папку ROOT и папку с именем файла .war. Удаление .war удалит соответствующую папку и распакует приложение, но ROOT останется и должен быть удален вручную и требует перезагрузки Tomcat. До перезапуска любого развертывания ROOT.war не удастся.
  • Я понял, что есть некоторые причины, препятствующие развертыванию ROOT.war. Возможно, существует ROOT.xml в conf/{имя-двигателя}/{имя-хоста} или папка ROOT существует в appBase хоста или как я описанное выше, приложение ROOT из предыдущего развертывания не разворачивается и требует перезапуска Tomcat.

В любом случае я не мог точно определить, что именно предотвращает развертывание ROOT.war, поскольку для этого требуется доступ к файлам журнала Tomcat и файлам conf, чтобы проверить случаи, описанные выше.

Также из всего, что я вижу, мой администратор кажется неспособным поддерживать сервер Tomcat и находить проблему. Поэтому я решил пойти с выделенным сервером Tomcat после борьбы с общим.

Ответ 1

В вашем вопросе вы указываете, что администратор установил контекст как:

<Context path="" docBase="path of my-application deployed folder"/>

Основываясь на вышеприведенных комментариях, я хотел бы попытаться использовать относительный путь вашего приложения, а не абсолютный путь.

Я попробовал это на моем сервере tomcat с помощью:

<Context path="/" docBase="my-application/" />

и это сделало трюк.

Элемент Host, содержащий элемент Context, фактически устанавливает некоторые параметры, которые также могут влиять на контекст. Если это настройки по умолчанию, то относительный контекст должен просто указывать на папку webapps. Если он был изменен, результаты могут отличаться.

Ответ 2

Обычно это может быть достигнуто с помощью следующих шагов:

  • Определить файл контекста ROOT.xml в conf/Catalina/localhost
  • Назовите ваш webapp WAR "ROOT.war" или содержащий папку "ROOT"

Однако я сомневаюсь, что вы сможете сделать это на общем экземпляре Tomcat. Только одно приложение может работать как приложение по умолчанию. Хостинг-компания, вероятно, не допустит этого, так как в противном случае, какое приложение они будут разрешать по умолчанию из числа людей, которые используют один и тот же экземпляр Tomcat?

Смотрите эту ссылку: http://staraphd.blogspot.com/2009/10/change-default-root-folder-in-tomcat.html

Ответ 3

В Tomcat Wiki есть раздел для размещения приложений в контексте по умолчанию. Однако для этого требуется некоторый контроль над сервером Tomcat, который может оказаться невозможным в описываемом вами совместном контексте.

Если у вас есть возможность устанавливать другие системы на сервере, одним из альтернативных решений будет использование прокси-сервера, такого как NGINX. Это сложнее, чем просто называть ваш военный файл ROOT.war, но иногда это единственный вариант.

Если у вас есть прослушивание NGINX на сервере, и у вас есть собственный URL-адрес, вы используете HttpProxyModule с настройками, такими как:

server {
        listen          80;
        server_name     my.domain.com;
        location / {
            proxy_pass              http://my-host/my-application;
            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;
        }
    }

Также для выполнения этой работы вам нужно будет иметь URL-адрес "my.domain.com", и он должен быть отделен от того, который все используют для общего сервера Tomcat.

Часть nginx решения бесплатна, но если вам нужно зарегистрировать новый URL-адрес, а затем использовать что-то вроде no-ip.com для перенаправления на сервер tomcat, это будет стоить денег.