Синопсис
В сегодняшнем посте рассмотрим весь процесс компиляции tomcat из исходников, а затем его настроим и запустим. Эксперимент будем проводить на linux ubuntu на примере tomcat 7.
Первый вопрос который может появится, что тут сложного? А второй, зачем вообще его компилировать из исходников, если можно взять уже готовый бинарный дистрибутив? Ну во-первых это вообще интересно как этот tomcat собирать из исходников, а во-вторых все кто когда-либо имел дело с установкой tomcat, вся его установка сводилась к скачиванию бинарного дистрибутива и его запуском, то есть выполнением скрипта ./startup.sh, а в виндовс мире так там вообще все еще проще, там инсталятор создает ярлыки запуск в меню start. Тут же мы пройдем через все шаги от скачивания исходников, до более или менее тонкой настройки tomcat.
Для этого поста на понадобится:
- JRE — виртуальная java-машина на которой выполняется tomcat.
- Apche ant — инструмент для сборки приложений
- Исходники tomcat — это просто непонятный для машины текст, который ничем не отличается от текста этого поста (в смысле тоже состоит из символов), и который надо преобразовать в бинарный код, понятный машине.
Добавление юзера tomcat
Начнем с того, что добавим пользователя tomcat который будет ответственен за веб-сервер tomcat, то есть администратора веб-сервера tomcat. Для чего он нужен? Он нужен для того, чтобы только он мог запускать и останавливать сервер, плюс только он может (вместе с рутом) изменять конфигурацию сервера.
sudo useradd -d /home/tomcat -U tomcat
ключ -d означает домашняя директория, ключ -U имя пользователя.
После того как юзер tomcat создан зададим ему пассворд:
sudo passwd tomcat Введите новый пароль UNIX: Повторите ввод нового пароля UNIX: passwd: пароль успешно обновлён
Теперь сделаем юзера tomcat сюдоером:
sudo adduser tomcat sudo Добавляется пользователь «tomcat» в группу «sudo» ... Добавление пользователя tomcat в группу sudo Готово.
Чтобы проверить, что юзер tomcat стал сюдоером можно открыть файл /etc/group и найти в нем строку: sudo:x:27:#####,#####,tomcat
Или переключиться в юзера tomcat и ввести команду (как переключаться в другого юзера, чуть дальше):
sudo whoami
Если команда sudo whoami вернет root значит юзер tomcat стал сюдоером. Поясню почему команда whoami возвращает рута, а не tomcat, потому что когда запускается какая-нибудь команда с sudo, это значит, что она запускается от имени рута, соответственно команда sudo whoami запускается как рут и результат будет пользователь рут.
Теперь создадим домашний каталог для юзера tomcat:
sudo mkdir /home/tomcat
И назначим владельца каталога юзера tomcat:
sudo chown tomcat /home/tomcat
Теперь переключимся в пользователя tomcat и перейдем в его домашний каталог:
su tomcat Пароль: cd
Скачавание исходников tomcat
В предыдущем шаге мы создали юзера tomcat и перешли в его домашний каталог. Теперь создадим в его домашнем каталоге каталог downloads и перейдем в него:
mkdir downloads cd downloads
Теперь переходим на сайт http://tomcat.apache.org/download-70.cgi для скачивания исходников, которые можно найти в самом низу страницы в разделе Source Code Distributions и скачайте их в каталог downloads который мы только что создали.
Измените владельца этого архива на tomcat (если надо):
sudo chown tomcat apache-tomcat-7.0.54-src.tar.gz [sudo] password for tomcat:
Разпакуйте архив в текущий каталог:
tar xvzf apache-tomcat-7.0.54-src.tar.gz
а архив можно удалить:
rm apache-tomcat-7.0.54-src.tar.gz
Установка apache-ant
Компилировать tomcat будем с помощью сборщика apache-ant. Заходим на сайтapache-ant и скачиваем дистрибутив в каталог downloads. На момент написания поста, последний был 1.9.4.
Распакуем его в текущий каталог:
tar xvzf apache-ant-1.9.4-bin.tar.gz
Переместим его в общий каталог /usr/bin
sudo cp apache-ant-1.9.4-bin.tar.gz /usr/bin
Теперь добавим этот путь в переменную окружения PATH для того:
PATH=/usr/bin/apache-ant-1.9.4:$PATH
Удаляем архив и распакованный каталог из каталога downloads:
rm -rf apache-ant*
Ключ -r нужен для того, чтобы каталог apache-ant-1.9.4-bin был удален рекурсивно, а ключ -f чтобы linux не выводила предупреждение, что архив apache-ant-1.9.4-bin.tar.gz защищенный.
Теперь проверим, что apache-ant видим:
ant -version Apache Ant(TM) version 1.9.4 compiled on April 29 2014
Если ответ такой, то значит переходим к компиляции tomcat, если нет, то еще раз пройдите через шаг Установка apache-ant.
Компиляция tomcat
И так каталог с исходниками tomcat скачен и распакован, apache ant настроен, теперь заходим в каталог с исходниками tomcat:
cd apache-tomcat-7.0.54-src.tar.gz
открываем на редактирование файл build.properties.default:
build.properties.default
# ----- Default Base Path for Dependent Packages ----- # Please note this path must be absolute, not relative, # as it is referenced with different working directory # contexts by the various build scripts. base.path=/usr/share/java #base.path=C:/path/to/the/repository #base.path=/usr/local
Ищем в нем строчку #base.path=/usr/local, раскомментируем ее и изменим путь на /home/tomcat/downloads/tomcat (строчка 7):
build.properties.default
# ----- Default Base Path for Dependent Packages ----- # Please note this path must be absolute, not relative, # as it is referenced with different working directory # contexts by the various build scripts. base.path=/usr/share/java #base.path=C:/path/to/the/repository base.path=base.path=/home/tomcat/downloads/tomcat
Что мы сейчас сделали? Мы указали каталог, куда билдскрипт будет скачивать необходимые для сборки исходники. Затем переименуем файл в build.properties:
mv build.properties.default build.properties
И теперь мы дошли до компиляции tomcat. Сначала очистим каталог:
ant clean clean-depend
и с компилируем tomcat командой ant -Dno.build.dbcp=true:
ant -Dno.build.dbcp=true
Если в все было сделано правильно, то билд должен вернуть BUILD SUCCESSFUL:
build: [javac] Compiling 31 source files to /home/tomcat/downloads/apache-tomcat-7.0.54-src/output/jdbc-pool/classes [javac] warning: [options] bootstrap class path not set in conjunction with -source 1.5 [javac] warning: [options] source value 1.5 is obsolete and will be removed in a future release [javac] warning: [options] target value 1.5 is obsolete and will be removed in a future release [javac] warning: [options] To suppress warnings about obsolete options, use -Xlint:-options. [javac] 4 warnings [jar] Building jar: /home/tomcat/downloads/apache-tomcat-7.0.54-src/output/jdbc-pool/tomcat-jdbc.jar [copy] Copying 1 file to /home/tomcat/downloads/apache-tomcat-7.0.54-src/output/build/lib BUILD SUCCESSFUL Total time: 23 seconds
если это так, то поздравляю, компиляция tomcat прошла успешно, и его билд должен появится в каталоге output/build.
Настройка tomcat
После того как tomcat успешно с компилирован, теперь под настроем его чуть-чуть. Сначала перенесем его в более приемлемый каталог, пусть это будет каталог bin где юзер tomcat будет складывать все свои бинарные приложения.
Создадим каталог bin в домашнем каталоге юзера tomcat:
mkdir bin
Теперь перенесем с компилированный tomcat в каталог bin:
cp -r /home/tomcat/downloads/apache-tomcat-7.0.54-src/output/build /home/tomcat/bin
Напоминаю сам tomcat с компилирован в каталог build.
Далее перейдем в каталог /home/tomcat/bin и переименуем каталог build на что-то по понятней, например на apache-tomcat-7:
mv build apache-tomcat-7
По умолчанию все веб-приложения помещаются в каталог webapps каталога {$CATALINA_HOME}. Мы создадим отдельный каталог куда будут помещаться веб-приложения, чтобы в сам каталог {$CATALINA_HOME} не заходить без надобности, так как файлы веб-приложения могут меняться относительно часто в отличие от файлов самого контейнера сервлетов.
Перейдем в домашний каталог юзера tomcat и создадим каталоге с таким же именем webapps:
cd mkdir webapps
Теперь самое важное, у нас есть каталог веб-сервера /home/tomcat/bin/apache-tomcat-7 и есть каталог /home/tomcat/webapps куда будут помещаться веб приложения. Ограничим к ним доступ до юзера tomcat:
sudo chmod -R 700 /home/tomcat/bin/apache-tomcat-7 [sudo] password for tomcat: sudo chmod -R 700 /home/tomcat/webapps
Теперь пропишем путь к каталогу, в который будем помещать все вэб-приложения, в конфигурационном файле сервера server.xml. Перейдем в каталоге bin/apache-tomcat-7/conf, где хранятся все файлы конфигурации сервера, и откроем на редактирование файл server.xml. В теге Host поменяем значение атрибута appBase с webapps на /home/tomcat/webapps (строчка 124):
server.xml
<?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Note: A "Server" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --> <Server port="8005" shutdown="SHUTDOWN"> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> <Listener className="org.apache.catalina.core.JasperListener" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html --> <Service name="Catalina"> <!--The connectors can use a shared executor, you can define one or more named thread pools--> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- A "Connector" using the shared thread pool--> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the BIO implementation that requires the JSSE style configuration. When using the APR/native implementation, the OpenSSL style configuration is required as described in the APR/native documentation --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> --> <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!-- An Engine represents the entry point (within Catalina) that processes every request. The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host). Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine name="Catalina" defaultHost="localhost"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="/home/tomcat/webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
Теперь добавим админку, с помощью которой юзеры смогут деплоить веб приложения, но для них юзер tomcat должен выдать соответствующие права. Но юзер tomcat выдаст себе права. Для этого переходим в каталог conf:
cd /home/tomcat/bin/apache-tomcat-7/conf
и открываем на редактирование файл tomcat-users.xml.
Раскомментируем последние пять тегов, и добавим роли для usrename tomcat:
Строчка 31:
tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <tomcat-users> <!-- NOTE: By default, no user is included in the "manager-gui" role required to operate the "/manager/html" web application. If you wish to use this app, you must define such a user - the username and password are arbitrary. --> <!-- NOTE: The sample user and role entries below are wrapped in a comment and thus are ignored when reading this file. Do not forget to remove <!.. ..> that surrounds them. --> <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="tomcat" roles="tomcat, manager, manager-gui, admin-gui"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="role1" password="tomcat" roles="role1"/> </tomcat-users>
Теперь удалим юзера tomcat из группы sudo. Зачем это делать? Затем, что sudo детям не игрушка, нам нужно было назначить юзера tomcat сюдоером, чтобы не переключаться постоянно в сюдоера, если нам надо было установить права на каталог где будут лежать веб-приложения и проч. Но а теперь, когда уже все сделано и мы точно знаем, что юзер tomcat не будет заниматься никакими другими админискими задачами кроме как запускать/останавливать сервер и настройку этого сервера, то и не зачем ему быть сюдоером. Для этого перейдем в другого сюдоера, и выполним от имени того другого сюдоера команду:
sudo gpasswd -d tomcat sudo Удаление пользователя tomcat из группы sudo
Здесь у команды gpasswd ключ -d означает удалить юзера tomcat из группы sudo.
И последнее что осталось нам сделать это скопировать все веб-приложения из каталога /home/tomcat/bin/apache-tomcat-7/webapps в наш созданный каталог /home/tomcat/webapps:
cp -r /home/tomcat/bin/apache-tomcat-7/webapps/* /home/tomcat/webapps
Запуск веб-сервера tomcat
Все готово для запуска веб-сервера tomcat. Перейдем в каталог /home/tomcat/bin/apache-tomcat-7/bin и запустим скрипт ./startup.sh:
cd /home/tomcat/bin/apache-tomcat-7/bin ./startup.sh Using CATALINA_BASE: /home/tomcat/bin/apache-tomcat-7 Using CATALINA_HOME: /home/tomcat/bin/apache-tomcat-7 Using CATALINA_TMPDIR: /home/tomcat/bin/apache-tomcat-7/temp Using JRE_HOME: /usr/java Using CLASSPATH: /home/tomcat/bin/apache-tomcat-7/bin/bootstrap.jar:/home/tomcat/bin/apache-tomcat-7/bin/tomcat-juli.jar Tomcat started.
Проверим, что tomcat запущен, для этого перейдем по линке http://localhpst:8080 и должна появится стартовая страница tomcat:
Теперь зайдем в админку, жмем на батон Manager App:
Вводим логин и пароль tomcat, tomcat которые мы определили в файле tomcat-users.xml:
после этого появится админка tomcat:
Если Tomcat не доступен на запускаемом порту извне, то необходимо проверить настройки фаервола и открыть порт.