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

Как добавить символическую ссылку в качестве веб-приложения в веб-приложения в Tomcat 7 в Linux?

Настроить

Я использую Apache Tomcat 7 в дистрибутиве Arch linux, а мой каталог webapps находится по адресу /usr/share/tomcat7/webapps. В этом каталоге нужно создать каталог и поместить в него каталоги META-INF и WEB-INF с файлами конфигурации xml. Тогда этот каталог будет основным путем для веб-приложения. Так например:

Если /usr/share/tomcat7/webapps/foo/bar.html содержит:

<!DOCTYPE html>
<html>
  <body>
    Hello world!
  </body>
</html>

затем http://localhost:8080/foo покажет:

Hello world!

Однако цель состоит в том, чтобы иметь внешний динамический проект (в данном случае распространяемый Netbeans) в виде веб-приложения. Итак, в этом случае я хотел бы разместить свое веб-приложение здесь: /home/user/NetbeansProjects/foo/build/web/ (который содержит bar.html).


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

Подход 1 (символическая ссылка)

Я подумал, давайте поместим символическую ссылку (символическую ссылку) в каталог webapps с помощью этой команды:

$ ln -s /home/user/NetbeansProjects/foo/build/web /usr/share/tomcat7/webapps/foo

Это кажется наиболее элегантным подходом, но Tomcat не может читать каталог. Почему нет?


Подход 2 (крепление - привязка)

Я читал, что вы также можете перенаправить один каталог в другой, используя mount --bind. Итак, я попытался сделать это:

sudo mount --bind /usr/share/tomcat7/webapps/foo /home/user/NetbeansProjects/foo/build/web

Собственно, это единственное решение, которое действительно работает. К сожалению, если я снова соберу проект, монтирование исчезнет. Я уже пробовал перемонтировать каталог после распространения проекта с помощью <exec/> в Ant, но это вызывает сбой Linux по какой-то странной причине. Так что это тоже не вариант. Кроме того, перемонтирование после каждой чистой сборки не является чистым подходом. Монтаж также не используется для такого рода вещей, поэтому я полагаю, что решение не будет включать монтаж.


Подход 3 (server.xml)

Последнее, что я хочу сделать, это пойти вразрез с рекомендациями разработчиков Apache (посмотреть здесь). Что говорит:

НЕ рекомендуется размещать элементы непосредственно в файле server.xml.

Итак, что мне делать, я беру server.xml по умолчанию и добавляю этот Context-tag к Host-тегу:

<Context docBase="/home/user/NetbeansProjects/foo/build/web/" path="/foo"></Context>

Однако, если я перезапущу службу Tomcat, она не запустится. В лог-файлах я прочитал:

SEVERE: Error starting static Resources
java.lang.IllegalArgumentException: Document base /home/user/NetbeansProjects/foo/build/web does not exist or is not a readable directory

Итак, очевидно, что это какая-то проблема с разрешением. Поскольку я дважды проверил орфографические ошибки, путь должен быть правильным. Но я не могу решить эту проблему, что я сделал для предоставления разрешения tomcat7 (group: tomcat7):

chown -R tomcat7:tomcat7 /home/user/NetbeansProjects/foo/build/web
chmod -R 755 /home/user/NetbeansProjects/foo/build/web

Но после перезапуска Tomcat возникает та же ошибка, и Tomcat не запускается.


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

Что @Schrute сказал в комментарии (не ответ): используйте вариант №1 (ln -s) и просто разрешить связывание в файле Tomcat context.xml. Для Tomcat 7:

<?xml version="1.0" encoding="UTF-8"?>
<Context allowLinking="true">
...

Tomcat 8:

<Context>
    <Resources allowLinking="true"></Resources>
...

НЕ ДЕЛАЙТЕ ЭТО В WINDOWS (или любой другой файловой системе без учета регистра), так как это отключит проверку чувствительности к регистру, что позволит раскрыть исходный код JSP среди других проблем безопасности. http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html

Точная причина, по которой Tomcat не может читать каталоги, как в подходах 1 и 3, мне до сих пор неизвестна. Однако Tomcat не может использовать какой-либо каталог, расположенный в /home/user/... как веб-приложение, даже если это означает использование символических ссылок для ссылки на это местоположение и установку правильных разрешений для каталогов!

Хотя наверное это какая-то встроенная защита. Это все еще странно, потому что такого поведения нет в документации Apache Tomcat (поправьте меня, если я ошибаюсь).

Поэтому решение состоит в том, чтобы использовать любой другой каталог, кроме /home/user/..., например /usr/share/tomcat7/projects должно сработать. Но опять же, лучше всего установить вывод моего дистрибутива Netbeans в каталог webapps напрямую, как указано другим человеком (@ user208992).

Итак, чтобы решить эту проблему, вот список инструкций, необходимых для работы Tomcat с Netbeans с использованием внешнего каталога build / dist:

  1. Настройте Netbeans для распространения build и dist каталоги в каталог за пределами /home/user/NetbeansProjects/project.

    Отредактируйте следующий файл: /home/user/NetbeansProjects/project/nbproject/project.properties, и измените строки:

    build.dir=build
    dist.dir=dist
    

    к

    build.dir=/srv/tomcat/project/build
    dist.dir=/srv/tomcat/project/dist
    

    Обратите внимание, что вы можете использовать любой каталог (кроме /home/...) вместо того /srv/tomcat/project

  2. Добавьте контекст с правильной базой документов на хост Tomcat.

    Один из способов сделать это - отредактировать server.xml файл конфигурации, вероятно, находится в /etc/tomcat7/server.xml. Добавить контекст в server.xml файл:

    <Context docBase="/srv/tomcat/project/build/web/" path="/project"></Context>
    

    Обязательно поместите это в <Host>-тег. Также вы можете добавлять атрибуты к этому тегу, когда это необходимо (перезагружаемый, antiJARLocking и т. Д.). Или вы также можете поместить в файл xml в CATALINA_HOME/engine(e.g. Catalina)/hostname(e.g. localhost)/project.xml, один из этих подходов подойдет.

    Я хочу указать docBase на .../build/web/ но вы также можете установить это на .../dist/ если вы хотите, чтобы Tomcat использовал WAR-файл.

  3. Убедитесь, что кот в том же users-группа, как ты. Для этого, например:

    usermod --append --groups users tomcat7
    

    Примечание. Достаточно любой общей группы с tomcat. Таким образом, Netbeans и Tomcat могут получить доступ к одному и тому же каталогу.

  4. Исправьте право собственности и разрешения на внешний каталог проекта.

    sudo chown -R tomcat7:users /srv/tomcat/project
    sudo chmod -R 777 /srv/tomcat/project
    

    Это предполагает, что вы user являются членами группы users, и tomcat7 это имя котаs user. You can check this incat / etc / passwd`.

    Примечание. Позже вы можете уменьшить 777-permissions, но чтобы убедиться, что Tomcat имеет разрешения, вы можете начать с наиболее доступных разрешений.

  5. Выполните очистку / сборку в Netbeans и перезапустите службу tomcat. При этом будут применены изменения из предыдущих шагов.

Я надеюсь, что это будет полезно для тех, кто сталкивается с подобной ситуацией; Tomcat и разрешения могут быть очень сложными для отладки imho.

Почему бы вам просто не позволить вашим netbeans построить желаемый каталог?

Возможно, стоит попробовать setenforce 0 чтобы отключить selinux и повторно протестировать указанные выше методы, если selinux включен. Если это сработает, повторно включите selinux и начните отслеживать проблемы с разрешениями.


Здесь есть всевозможные проблемы безопасности ... (Если вы хотите сделать что-то подобное в Cent / Oracle / REHL ... большинство системных администраторов скажут вам, что вам придется отключить selinux или потратить несколько часов на поиск журнала аудита )

Короче говоря, нет ничего elegant о немедленной публикации сборки программного обеспечения в любом месте. Количество потенциально возможных проблем - это кошмар (особенно с java и tomcat, скрывающимся в фоновом режиме).

Возможно, вам стоит вручную выполнить rsync из вашего экземпляра разработки в тестовый экземпляр. (IE под Tomcat). Если вы хотите, чтобы это происходило автоматически ... Вы МОЖЕТЕ добавить это в сценарий сборки.


Пс. У меня нет времени искать сопроводительную документацию ... итак: на мой взгляд, комбинировать этапы разработки и сборки (почти во всех случаях) - не лучшая практика и не "элегантно".

Я согласен с lVlint67 о разделении сборки и развертывания, но я также часто работаю с php / html / javascript в URL-адресе разработчика, где разделение просто мешает. Я использую метод символической ссылки, но уловка в том, что необходимо установить разрешения, чтобы веб-сервер мог читать место назначения символической ссылки.

Я использую:

host:~# mkdir dev
host:~# chown me.www-data dev
host:~# chmod g+rwx dev
host:~# cd /var/www
host:~# ln -s ~/dev ./

Чтобы это работало, вы должны быть членом группы www-data и не забывать, что файлы проекта должны быть доступны для чтения группой, а любые файлы, в которые ваше приложение должно записывать, должны быть доступны для записи для группы.

Это все без SELinux, поэтому ваш пробег может варьироваться в зависимости от конфигурации вашего сервера.