Инсталляция Tomcat под Linux

  Автор: © Allan Peda
Перевод: © Владимир Меренков.


  Screencap of the Tomcat Demo Webserver Running

  К настоящему моменту я уверен, у многих из вас может быть впечатление, что если вы не знаете Java, то ваше резюме несколько от этого проигрывает, и даже если вы знаете Java отлично, ваши работодатели с растущими запросами могут спросить, знаете ли вы Java Server Pages (JSPs), и/или сервлеты. К счастью, существует свободный сервер приложений для Java Server Pages и связанными с ним Java сервлетами, он называется Jakarta-Tomcat (далее просто Tomcat). Я решил скачать и установить его, документируя для справки свой опыт. Я устанавливаю Tomcat на старенький Pentium 2/200 под SuSE 7.2, однако думается, что шаги, описанные здесь, будут работать с любой современной версией, лишь бы с помощью Java можно было компилировать исходники.

Инсталяция апплет-сервера включает скачивание и компиляцию нескольких пакетов в дополнение к очевидно нужным для Java и Tomcat. Необходимы следующие пакеты:

Пакеты, требующиеся для установки Jakarta-Tomcat
ПакетИсточник  
Java SDK 1.3.1   Sun  
XML Parser Library 1.1   Sun  
Secure Sockets for Java 1.0.2   Sun  
Java Servlet API 3.2.3   Apache Foundation  
Jakarta Ant 1.3   Apache Foundation  
Jakarta Tomcat 3.2.3   Apache Foundation  

 

Устанавливаем Java

Инсталляция Java описывалась столь часто, что, наверное, не стоит эти инструкции повторять здесь, однако для полноты описания я быстренько пробегусь по этапам установки из RPM. Я скачал версию 1.3 SDK (также известный как JDK) с сайта Java, а 1.4 была Beta, и может быть к тому времени, когда вы будете читать эти строки, перестала быть таковой. В заметках к библиотеке Secure Sockets сказано, что 1.4 будет ее включать, так что инсталляция будет несколько проще.

Для Linux, Java от Sun приходит в виде скрипта, являющегося оболочкой для пакета RPM, поэтому вам нужно будет запустить его и согласиться с лицензией перед тем как собственно установите RPM.  После распаковки shell-скрипта в RPM, следуйте стандартным инстукциям по установке от имени root.

Установка Java из RPM (после распаковки)

    moby:~ > sudo rpm -Uv jdk-1.3.1.i386.rpm
    

Я модифицировал path, включив в него место расположения JDK, на SuSE советуется для этого редактировать /etc/profile.local, хотя в других дистрибутивах вы можете редактировать прямо /etc/profile. Учтите также, что переменные окружения $JAKARTA_HOME и $TOMCAT_HOME мы в настоящий момент можем игнорировать, но они могут вам понадобиться достаточно скоро, как часть процедуры установки, так что легче определить их сейчас. Примите во внимание, что я предварительно не устанавливал переменную CLASSPATH, хотя вы можете сделать это по желанию или при необходимости. Ниже вы увидите шаги, которые я сделал, чтобы быть уверенным, что Java может найти библиотеки.

Необходимые переменные окружения

    #!/bin/bash
    JAVA_HOME=/usr/java/jdk1.3.1
    JAKARTA_HOME=/opt/jakarta
    ANT_HOME=$JAKARTA_HOME/jakarta-ant
    TOMCAT_HOME=$JAKARTA_HOME/build/tomcat
    PATH=$JAVA_HOME/bin:$PATH

    export JAVA_HOME JAKARTA_HOME ANT_HOME PATH TOMCAT_HOME
    

Инсталляция библиотеки Java XML Parser

Я установил библиотеки для обработки XML, разархивировав zip-архив и скопировав требуемые библиотеки в lib/ext директорию (как root). Первоначально я распаковал этот файл в своей директории. Куда вы первоначально разпаковываете архив значения не имеет при условии, что Java знает, где искать установленные библиотеки.

Копирование jar-файлов библиотеки парсера XML

    unzip jaxp-1_1.zip; cd jaxp-1.1
    moby:~/jaxp-1.1 > sudo cp *.jar $JAVA_HOME/jre/lib/ext
    

Я люблю все делать по порядку. Итак, чтобы проверить, что ваша программа установки найдет новые библиотеки, я предлагаю запустить программу-пример, которая включена в библиотеку обработки XML.
Если ваша Java Virtual Machine (JVM) не может найти библиотеки, вы сделали ошибку похожую на эту:

Сообщение об ошибке

    moby:~/jaxp-1.1/examples/trax > java Examples
    Exception in thread "main" java.lang.NoClassDefFoundError: 
    javax/xml/transform/TransformerException
    

Если вы видите что-то такое, проверьте место расположения библиотек (.jar файлы). Я постоянно натыкался на эту проблему и разрешил ее путем копирования симлинков на корректное расположение или исправляя $CLASSPATH.

 

Инсталляция библиотеки Secure Sockets

Для установки Secure Sockets следуйте похожей процедуре, копируя .jar файлы в директорию ..lib/ext.

Библиотека Secure Sockets

    moby:~/jsse1.0.2/lib > sudo cp *.jar $JAVA_HOME/jre/lib/ext
    

Затем я отредактировал файл /usr/java/jdk1.3.1/jre/lib/security/java.security чтобы он содержал раздел о "com.sun.net.ssl.internal.www.protocol", которого не было в файле по умолчанию.

Раздел файла, посвященный SSL

    security.provider.1=sun.security.provider.Sun
    security.provider.2=com.sun.net.ssl.internal.ssl.Provider
    security.provider.3=com.sun.rsajca.Provider
    

Теперь, чтобы проверить, что javac сможет найти эти библиотеки, я быстренько напечатал следующий кусок кода, сохранил его как TestSSL.java и скомпилировал:

Проверка библиотеки Secure Sockets

    import javax.net.ssl.*;
    
    public class TestSSL {
	public static
	    void main(String [] arstring) {
	    try  {
		new java.net.URL("https://" + arstring[0] + "/").getContent();
	    } catch (Exception exception) {
		exception.printStackTrace();
	    }
	}
    }
    

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

      moby:~/jsse1.0.2 > javac TestSSL.java
Еще раз, если java не может найти библиотеки, тогда я получу ошибку java.lang.NoClassDefFoundError и не получится файл байткода TestSSL.class.

После компиляции с помощью javac в байткод, я захотел протестировать библиотеку ssl, подключившись к SSL сайту (sourceforge). Здесь необходимо определить использование SSL в комендной строке, или, как говорит документация Sun по установке, "добавьте название пакета обработчика к списку пакетов, который анализируется Java-классом URL". Я представляю себе это как аналог подключения с помощью опции компоновщика -lm библиотеки math, исключая время выполнения.
Явное указание обработчика
    
    moby:~/jsse1.0.2 > java \
    -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol \
    TestSSL sourceforge.net
    moby:~/jsse1.0.2 > echo $?
    moby:~/jsse1.0.2 > 0
    


Кстати, если бы я не включил этот аргумент для JVM, я получил следующую ошбку:

Сообщение об ошибке, связанное с неизвестным протоколом

    moby:~/jsse1.0.2 > java TestSSL sourceforge.net
    java.net.MalformedURLException: unknown protocol: https
	    at java.net.URL.<init>(URL.java:480)
	    at java.net.URL.<init>(URL.java:376)
	    at java.net.URL.<init>(URL.java:330)
	    at TestSSL.main(TestSSL.java:8)
    

Итак, теперь у нас есть Apache, Java, Java-библиотеки для XML и Secure Sockets и мы можем устанавливать Jakarta-Tomcat. Не совсем все - нам еще нужен Ant, реализация "make" на Java, и Servlet API.

 

Инсталляция Ant

Несмотря на тот факт, что мы не совсем готовы к установке дистрибутива Jakarta-Tomcat, следующий шаг включает установку некоторых неотъемлемых компонент Jakarta, так что нам нужно изменить наше окружение, чтобы сделать установку пакета возмодной. Мы делаем это, создавая переменную окружения $JAKARTA_HOME, с которой мы кратко познакомились вместе с переменной $JAVA_HOME. Я решил разместить Jakarta под /opt просто потому, что там было свободное место, а также потому, что все свои исходники я храню именно там, оставив /usr и /usr/local для RPM. Ну а теперь определяйтесь с тем, куда устанавливать Ant, перед тем как начать инсталляцию.

Сначала - скачайте и распакуйте. В моем примере я скачал сжатый сырец в мою домашнюю директорию, затем переместил в директорию $JAKARTA_HOME. Потом я распаковал его в директории $JAKARTA_HOME, позволив tar выбрать имя директории.

Подчиняясь требованию, что jakarta-ant должен(а) быть в директории с именем $JAKARTA_HOME/jakarta-ant я сделал симлинк на корректное имя директории. Затем я перешел в директорию jakarta-ant/ и как рут запустил скрипт bootstrap.sh. После выполнения скрипта там должна появиться новая субдиректория, содержащая библиотеки:

Сборка Jakarta - Ant

    moby:~ > cd $JAKARTA_HOME
    moby:~/opt/jakarta> tar xzf ~/jakarta-ant-1.3-src.tar.gz
    moby:/opt/jakarta > sudo ln -s jakarta-ant-1.3/ jakarta-ant
    moby:~/opt/jakarta > cd jakarta-ant
    moby:/opt/jakarta/jakarta-ant > sudo sh bootstrap.sh    
    moby:/opt/jakarta/jakarta-ant > ls -1 build/lib/
    ant.jar
    optional.jar
    

Вывод загрузочного скрипта Ant

 

Установка Servlet API

Следующим шагом мы устанавливаем servlet API, опять же сделав симлинк реальной директории, где распаковали, на требуемое имя директории:

Сборка Servlet API

    moby:/opt/jakarta > sudo tar xvzf \
    > ~/jakarta-servletapi-3.2.3-src.tar.gz 
    moby:/opt/jakarta > sudo ln -s jakarta-servletapi \
    > jakarta-servletapi-3.2.3-src
    moby:/opt/jakarta > cd jakarta-servletapi
    moby:/opt/jakarta/jakarta-servletapi >
    

Я был готов построить библиотеки jakarta servlet, используя скрипт build.sh. Но это был именно тот момент, когда я вынужден был пойтина небольшой "хак", чтобы справиться с двумя ошибками, касающимися библиотек:

Сообщения об ошибке, вызванные отсутствием библиотек

    moby:/opt/jakarta/jakarta-servletapi > sudo sh build.sh dist
    Exception in thread "main" java.lang.NoClassDefFoundError:
    org/apache/tools/ant/Main

    /opt/jakarta/jakarta-servletapi-3.2.3-src/build.xml:31: Cannot use
    classic compiler, as it is not available A common solution is to set
    the environment variable JAVA_HOME to your jdk directory.
    

Сообщения об ошибках выглядят разными, но на самом деле они оба ссылаются на то, что библиотеки не были найдены. Первое сообщение относится к библиотеке ant.jar, второе - к "потерянной" tools.jar. Чтобы решить эту проблему я создал два симлинка под $JAVA_HOME/jre/lib/ext, позволив Java найти заново созданные библиотеки ant.jar и tools.jar.

Создание симлинков для того, чтобы Java осенило, где искать потерянные библиотеки

    $JAVA_HOME/jre/lib/ext/ant.jar -> /opt/jakarta/jakarta-ant/build/lib/ant.jar
    $JAVA_HOME/jre/lib/ext/tools.jar -> /usr/java/jdk1.3.1/lib/tools.jar
    

Еще я знаю два варианта борьбы с этой проблемой, которые должны работать (но у меня это не получилось сделать):

  1. модифицируйте переменную окружения $CLASSPATH, чтобы она явно включала tools.jar и ant.jar .
    export CLASSPATH=$JAVA_HOME/lib/tools.jar:$ANT_HOME/lib/ant.jar
    or
  2. Явно определите опцию "-classpath", когда вызываете java. Вероятно, это не практично для всех больших скриптов.

После создания этих симлинков следующая команда работает прекрасно:

Сборка Tomcat

    moby:/opt/jakarta/jakarta-servletapi > sudo sh build.sh dist
    

Вот вывод скрипта сборки сервлета

 

Построение Tomcat

Наконец, момент истины, построение пакета Jakarta-Tomcat. У меня все еще есть одна ошибка,

Сообщения об ошибки, вызванные тем, что не была найдена директория bin

    moby:/opt/jakarta/jakarta-tomcat > sudo sh ./build.sh dist
    Buildfile: build.xml
    prepare:
    BUILD FAILED
    /opt/jakarta/jakarta-tomcat-3.2.3-src/build.xml:32: /opt/jakarta/jakarta-ant-1.3/bin not found.
    
    Total time: 2 seconds
    

Смысл этого сообщения об ошибке, в отличие от других, очевиден. После создания симлинков на на bin-директорию jakarta-ant работает безупречно.

Симлинк, делающий так, чтобы бинарники нашлись.

    moby:~ > cd /opt/jakarta/jakarta-ant
    moby:/opt/jakarta/jakarta-ant > sudo ln -s bootstrap/bin .
    

Здесь вывод скрипта построения Tomcat.

Теперь вы можете cd в $JAKARTA_HOME/dist/tomcat/bin и запустить startup.sh .

Запуск Jakarta-Tomcat

    moby:/opt/jakarta/dist/tomcat/bin > sudo ./startup.sh
    Using classpath: /opt/jakarta/build/tomcat/classes:/opt/jakarta/build/tomcat/lib
    /servlet.jar:/opt/jakarta/build/tomcat/lib/test:/usr/java/jdk1.3.1/lib/tools.jar
    allan@moby:/opt/jakarta/build/tomcat/bin > 2001-07-20 03:13:50 - ContextManager:
     Adding context Ctx( /examples )
    2001-07-20 03:13:50 - ContextManager: Adding context Ctx( /admin )
    Starting tomcat. Check logs/tomcat.log for error messages 
    2001-07-20 03:13:50 - ContextManager: Adding context Ctx(  )
    2001-07-20 03:13:50 - ContextManager: Adding context Ctx( /test )
    allan@moby:/opt/jakarta/build/tomcat/bin > 2001-07-20 03:13:53 - \
    PoolTcpConnector: Starting HttpConnectionHandler on 8080
    2001-07-20 03:13:53 - PoolTcpConnector: Starting Ajp12ConnectionHandler on 8007
    

Примерно также остановка:

Остановка Jakarta-Tomcat

    moby:/opt/jakarta/dist/tomcat/bin > sudo ./shutdown.sh 
    Using classpath:
    /opt/jakarta/build/tomcat/classes:/opt/jakarta/build \
    /tomcat/lib/servlet.jar:/opt/jakarta/build/tomcat/lib/test:/usr/java \
    /jdk1.3.1/lib/tools.jar
    Stop tomcat
    2001-07-20 03:15:47 - ContextManager: Removing context Ctx( /examples )
    2001-07-20 03:15:47 - ContextManager: Removing context Ctx( /admin )
    2001-07-20 03:15:47 - ContextManager: Removing context Ctx(  )
    2001-07-20 03:15:47 - ContextManager: Removing context Ctx( /test )
    

Поздравляю! После запуска начального скрипта, вы можете увидеть сраницу приветствия, указав браузеру на вебсервер, порт 8080 (по умолчанию).

Screencap of the Tomcat Demo Webserver Running

Бродя по этим страничкам, можно посмотреть на скриншоты примеров сервлетов и Java Server Pages. Это процедура, конечно, - на любителя подразнить себя, потому что, глядя на скриншоты, постоянно возникает соблазн попробовать позапускать демки. Но, с другой стороны, это все-таки здорово посмотреть, на что собственно говоря способен Jakarta Tomcat.

 

Работает!

В настоящий момент у вас запущено два сервера: простой вебсервер, "слушающий" порт 8080, и сервер приложения, являющегося контейнеров для сервлетов, который слушает порт 8007. Первое, что меня заинтересовало - это то, что все установлено рутом. Сопровождающая документация предлагает запускать сервер как "nobody", но мне казалось, что специальный пользователь jakarta, аналогично юзеру database, будет хорошим решением, так как для него можно установить переменные окружения. Имея специального юзера jakarta просто для сервлетов, можно оставить конфигурацию в домашней директории ~jakarta. Это будет тем более полезно, если в системе установлены другие версии java

Во всяком случае, все это довольно просто. После того, как юзер jakarta установлен, как показано, вы можете запустить jakarta под одноименным пользователем, и до тех пор, пока он использует непривилегированные порты, у вас не будет проблем. Хотя я подумал, что права доступа могли бы быть еще более аскетичными, чтобы только юзер jakarta мог запускать контейнер для сервлетов, так что я остановил сервер и изменил права доступа следующим образом:

Ужимаем права

    moby:/opt/jakarta > sudo $TOMCAT_HOME/bin/shutdown.sh 
    moby:/opt/jakarta > sudo /usr/sbin/groupadd jakarta
    moby:/opt/jakarta > sudo /usr/sbin/useradd -g jakarta -c \
    > "Java Server Pages" jakarta
    moby:/opt/jakarta > sudo mkdir /home/jakarta
    moby:/opt/jakarta > sudo chown jakarta.jakarta /home/jakarta
    moby:/opt/jakarta > sudo chown -R jakarta.jakarta $JAKARTA_HOME
    moby:/opt/jakarta > sudo su - jakarta
    moby:~ > cd $JAKARTA_HOME
    

Можно, конечно, установить и пароли, но так как руту все эти пароли, что есть что нет, то меня это мало волнует. Я решил сузить некоторые права доступа по использованию этого скрипта. Теперь только юзер jakarta может стартовать или остановить сервлеты и страницы Java сервера. Переменные окружения, установленные в /etc/profile или /etc/profile.localб теперь могут быть в ~jakarta/.profile или ~jakarta/.bash_profile, оставляя право выбора иной версии java другим пользователям и уменьшая число переменных окружения.

Теперь, когда Tomcat запущен, вы можете поэкспериментировать с изменениями в конфигурации. Здесь много опций, и конечно, так как Jakarta - это проект на базе Apache, он разработан, чтобы его было легко интегрировать с Apache. Просмотрите руководство пользователя, там есть несколько хороших примеров, также, консультации по этому проекту можно получить на сайте. XML - "родной" формат его конфигурационных файлов, и вам нужно будет пройти в аварийном порядке курс изучения XML, но этого курса будет недостаточно. Чтобы начать, см. конфигурационные файлы "server.xml" и "web.xml".

Итак, добро пожаловать в мир Java Server Pages и Servlets. Вы найдете, что это хорошо продуманная и интересная технология. Удачи.


Ссылки:
  1. Linux as an Application Server -- The Tomcat Way
    by Chris Bush http://www.sysadminmag.com/linux/articles/v10/i01/a4.htm
  2. Sun's Java Software Development Kit 1.3.1
    http://java.sun.com/products/
  3. Java Secure Sockets Extension (JSSE) version 1.0.2 or later
    http://java.sun.com/products/jsse/
  4. Java API for XML Parsing implementation 1.1
    http://java.sun.com/xml
  5. Jakarta Tomcat download (includes Jakarta Tomcat, ANT, Servlet API)
    http://jakarta.apache.org/site/sourceindex.html
    Note that Ant is a separate project, but the servlet API source is in the same download directory as the Jakarta-Tomcat source.
  6. Build secure network applications with SSL and the JSSE API
    by Todd Sundsted http://www.javaworld.com/javaworld/jw-05-2001/jw-0511-howto.html
  7. The Ant FAQ: http://jakarta.apache.org/ant/faq.html
  8. The Tomcat Users Guide
    http://jakarta.apache.org/tomcat/tomcat-3.3-doc/tomcat-ug.html

Allan Peda

Allan имеет счастье пользоваться Linux примерно с 1995 года, немного позже он открыл для себя Perl. Сейчас он работает экспертом-консультантом по Linux в Нью-Йорке. Алану нравится серфинг и плавание на парусных судах. Также он мечтает о том, как однажды он приобретет свою собственную яхту и будет на ней плавать в тихих водах Коста Рики

 


Copyright © 2001, Allan Peda.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 69 of Linux Gazette, August 2001

Вернуться на главную страницу