Tomcat

From EIK wiki

Autor

Kristjan Veskimäe D32

2013

Sissejuhatus

Tomcat on vabalt kättesaadav server Java veebirakendustele. Põhimõtteliselt on tegemist Servlet/JSP spetsifikatsiooni toetava konteineriga. Kiire käivitumise ning rakenduste käigultvahetuse tõttu on Tomcat hea valik väiksemate ning keskmise suurusega Java veebirakenduste käitamiseks.

Antud töö kirjeldab Tomcati 8. versiooni. Põhiosa on üldiselt samasugune võrreldes paari eelmise versiooniga. Suuremad erinevused on versioonispetsiifilistes probleemides ja nende lahendamises, mida käesolev töö ei vaatle.

Töö vaatleb Tomcati paigaldamist ja seadistamist Unix-laadsesse keskkonda ning eeldab lugejalt algteadmisi sarnastes süsteemides. Tomcati on võimalik paigaldada ka Windows-keskkonda, kuid antud veebiserver eeldab kasutaja poolt käsureal töötamist ning Tomcati failihierarhias orienteerumist. Põhimõtteliselt on Java veebirakenduste arendamiseks IDE-abil võimalik siiski ka kasutada IDE-sse integreeritud Tomcati serverit - näiteks pakuvad sellist võimalust Eclipse EE ja NetBeans - kuid seda käesolev töö ei vaatle.

Mõisted

  • Kontekst (context) - Tomcati mõistes üks konkreetne veebiaplikatsioon
  • Konteiner (container) - veebiserver Tomcat ise
  • Kontekstikirjeldus (context descriptor) - Tomcati-spetsiifiline konteksti konfiguratsioonimääratlus; peremehepõhine osa loetakse failist $CATALINA_HOME/conf/[enginename]/[hostname]/context.xml ja sellele lisatakse kontekstispetsiifilised täpsustused failist $CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml; kontekstikirjeldus määrab näiteks nimed ressurssidele, sessioonihalduse parameetrid jmt. (olgu märgitud, et Tomcati varasemates versioonides sisaldusid kontekstikirjeldused põhikonfiguratsioonifailis server.xml)
  • Dokumendipõhi (docBase) - kontekstile vastav kataloog Tomcati "webapps" kataloogis, mis tekib veebiaplikatsiooni serverisse rakendamisel
  • Veebiarhiiv (Web application ARchive, war-file) - Java veebiaplikatsiooni jagatakse hea tava kohaselt selle üheainsa veebiarhiivi failina, mille laienditüübiks on "war". Tegemist on zip-protokolliga kokkupakitud kataloogiga, millel on Java veebirakenduste spetsifikatsioonile vastav ülesehitus. Siiski võib veebiaplikatsioon olla juurutamisel ka lahtipakendatud olekus (inglisekeelne termin on "war is exploded").

Ülesehitus

Kataloogid
$CATALINA_HOME baaskataloog, kuhu on Tomcat paigutatud
$CATALINA_BASE parasjagu töösoleva Tomcati eksemplari baaskataloog, mille alusel lahendatakse teed ülejäänud kataloogide ja failideni; ainult ühe kasutusel oleva Tomcati eksemplari puhul on see sama, mis $CATALINA_HOME
$CATALINA_BASE/bin serveri käivitus- ja abiskriptid
$CATALINA_BASE/conf konfiguratsioonifailid
$CATALINA_BASE/lib Tomcatile vaikimisi kättesaadavad Java klassiteegid (class libraries) ehk .jar-failid kuhu on Java kompileeritud kood kokku pakendatud
$CATALINA_BASE/logs logifailid paigutatakse vaikimisi siia
$CATALINA_BASE/webapps kataloog, kuhu paigutatakse serverisse juurutatavad veebiaplikatsioonid


Mõned olulisemad failid
$CATALINA_BASE/bin/startup.sh serveri käivitusskript
$CATALINA_BASE/bin/shutdown.sh serveri peatusskript
$CATALINA_BASE/conf/server.xml konteineri peamine konfiguratsioonifail
$CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml serveri administraatori jaoks konteinerisse endasse ümber kopeeritud rakendusepõhine kontekstikirjelduse konfiguratsioon failist $CATALINA_BASE/webapps/[ApplicationName]/META-INF/context.xml
$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml fail, mis aitab administraatoril konteksti kohta käivat infot kirjeldada peremeesmasina-põhiselt ja halduseks mõeldud automaat-tööriistadel (näiteks Tomcat Manager ja TCD) oma tööd teha
$CATALINA_BASE/$CATALINA_BASE/conf/[enginename]/[hostname]/manager.xml fail, mis võimaldab lisada rakendustele ligipääsufiltreid
$CATALINA_BASE/webapps/[webappname]/META-INF/context.xml kontekstikirjeldusfail, mille veebirakenduse programmeerija on pakendanud oma aplikatsiooniga kaasa ning millega ta saab võimaluse kontekstikirjeldust omalt poolt mõjutada; kirjutatakse rakenduse uuestijuurutamisel üle, mistõttu administraator peaks muutma selle asemel konteinerisse ümber kopeeritud püsieksemplari $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml
$CATALINA_BASE/webapps/[webappname]/WEB-INF/web.xml ka üks oluline Java veebiaplikatsiooni konfiguratsioonifail, mille pakendatakse koos veebiarhiiviga; enamasti muudab seda ainult programeerija; määrab muu hulgas millised aplikatsiooni osad vajavad autentimist või kui kiiresti veebisessioon aegub

Installeerimine

Installeerimine paketihalduriga

apt-cache search tomcat
apt-get install tomcat[version]-webapps
apt-get install tomcat[version]-admin
apt-get install tomcat[version]

Installeerimine käsitsi

Paketihalduriga installeerides ei pruugi viimane Tomcati versioon olla kättesaadav ja see pakub ka vähem võimalusi kataloogide määramiseks jms. Käsitsi installeerimiseks tuleb laadida Tomcat kodulehelt alla. Lahtipakkimisel tekib kataloog, milles sisalduv fail "RUNNING.txt" on kõige kindlam allikas installeerimisel tekkivate probleemide vältimiseks ning lahendamiseks.

Vajaliku versiooni installeerimisfaili asukoha saab vaadata Tomcati kodulehelt sektsioonist "Download". Järgnevas näites installeerime Tomcati kõige uuema ebastabiilse kandidaatversiooni, mida näitab nimes sisalduv RC ehk "release candidate". Produktsioonikeskkonda tuleks siiski valida stabiilse versiooni. Käsitsi installeerimine on sarnane järgmisega:

wget http://mirror.nexcess.net/apache/tomcat/tomcat-8/v8.0.0-RC5/bin/apache-tomcat-8.0.0-RC5.tar.gz
tar -zxvf apache-tomcat-8.0.0-RC5.tar.gz
mv /Users/kristjanveskimae/downloads/apache-tomcat-8.0.0-RC5 /usr/local/apache-tomcat-8.0.0-RC5
rm -f /Library/Tomcat 
ln -s /usr/local/apache-tomcat-8.0.0-RC5/ /Library/Tomcat 
chown -R kristjanveskimae /Library/Tomcat
chmod +x /Library/Tomcat/bin/*.sh

Käivitamine ja aplikatsiooni juurutamine

Konteineri käivitamine

Tomcati käivitamise eelduseks on Java paigaldamine masinasse ning keskkonnamuutujate "JAVA_HOME" ja "JRE_HOME" defineerimine. Peale installeerimist võib kasutada skripte kataloogist $CATALINA_BASE/bin . Järgneb üks võimalik käivitamise ja peatamise näide, mis on kasutatav eelnevalt kirjeldatud käsitsi installeerimise juhul:

/Library/Tomcat/bin/startup.sh 

ja peatamiseks

/Library/Tomcat/bin/shutdown.sh 

Näiteaplikatsiooni juurutamine

Java veebiaplikatsiooni jagatakse hea tava kohaselt üheainsa veebiarhiivi failina. Siiski võib Tomcati juurutada ka lahtipakendatud olekus ("exploded") Java veebiaplikatsiooni.

Käsitsi juurutamine ja mahavõtmine

Näiteaplikatsiooni juurutamiseks lae selle veebiarhiivifail alla ning kopeeri oma konteineri juurutamiskataloogi 'webapps':

wget http://tomcat.apache.org/tomcat-8.0-doc/appdev/sample/sample.war
cp /Users/kristjanveskimae/downloads/sample.war /Library/Tomcat/webapps/sample.war
Pilt 1: Õnnestunult rakendatud näiteaplikatsioon

Kui konfiguratsioonifailis $CATALINA_BASE/conf/server.xml on märgendi "Host" atribuudi "autoDeploy" väärtus "true", installeerib ja uuendab Tomcat aplikatsioone dünaamiliselt töötamise ajal. Kui väärtuseks on "false", käib installeerimine staatiliselt ning serverisse juurutamiseks tuleb teha konteineri taaskäivitus. 1 Mõlemal juhul pakib konteiner arhiveeritud faili ise lahti samasse kausta $CATALINA_BASE/webapps ning ka juurutab selle. Tekkiv aplikatsioon on lokaalsest masinast seejärel kättesaadav aadressil http://localhost:8080/sample/ . Kui rakendamine õnnestub, siis peaks olema brauserist nähtav sarnane lehekülg nagu pildil 1.


Veebirakenduse käsitsi mahavõtmiseks tuleb kustutada talle vastav dokumendipõhja kataloog "webapps" kataloogist. Samuti tuleks kustutada .war-fail olemaks kindel, et Tomcat ei rakenda uuel käivitamisel veebiaplikatsiooni veebiarhiivifailist. Veelgi lihtsam on mahavõtmine brauseriga haldusrakenduse kaudu.

Rakenduste baaskataloogi "webapps" asukohta saab muuta failis $CATALINA_BASE/conf/server.xml peremehepõhiselt määratava atribuudiga "appBase", sealjuures Tomcati vaikimisi peremees ehk "Host" on "localhost".

Tomcati vahendid juurutamiseks

Veebiaplikatsioonide juurutamine ja mahajuurutamine on võimalik ka kaughalduse teel tänu Tomcati internetipõhisele haldusrakendusele. Näiteks saab veebibrauserit kasutades teha serveri põhitoiminguid Tomcati enda HTML-põhise rakendusega "Tomcat Manager". Veebipõhine haldusrakendus töötab ka käsupõhise veebiteenusena, millele on valmis ehitatud Anti ja Maveni integratsioonid. Samuti eksisteerib käsurea kliendirakendus TCD (Tomcat Client Deployer). TCD ei kuulu Tomcati baaskoosseisu, kuid pakub peale serveri administreerimise tavatoimingute ka lisafunktsionaalsust nagu veebirakenduse kokkukompileerimine ja pakendamine. 1

Haldurakendus "Tomcat Manager"

Tomcati haldusrakendus "Tomcat Manager" (antud alamjaotuses lihtsalt haldusrakendus) on Tomcati enda veebiaplikatioon Tomcati brauseripõhiseks kaughalduseks, võimaldades muu hulgas järgnevat 1:

  • Rakendada uue veebiaplikatsiooni war-faili üleslaadimisega;
  • Näha kõiki rakendatud veebiaplikatsioone koos aktiivsete sessioonidega;
  • Taasrakendada veebirakendust, näiteks veebiarhiivi pakitud klassifailide /WEB-INF/classes või teekide /WEB-INF/lib uuendamisel, kinnijooksmisel jms.;
  • Peatada veebirakendust ilma serverist eemaldamata, samuti koos serverist eemaldamisega;
  • Vaadata operatsioonisüsteemi ja Java parameetrite väärtusi;
  • Näha kõiki saadaolevaid JNDI ressursse, k.a. andmebaasiühendusi, mis aitavad rakenduste programmeerijail defineerida <ResourceLink> elemendid web.xml konfiguratsioonifailis.

Tomcati installatsioon sisaldab haldusrakendust juba vaikimisi. Haldusrakenduse töölepanemiseks tuleb peremeesmasina konfiguratsioonikataloogi $CATALINA_BASE/conf/[enginename]/[hostname] lisada ka fail manager.xml. Vaikimisi valmiskonfigureeritud testrakendusel on see fail juba olemas asukohas $CATALINA_BASE/conf/Catalina/localhost/manager.xml . Rakendus asub vaikimisi aadressil http://[host]/manager/ , vaikimisi konfiguratsioone kasutades lahendub see asukohaks http://localhost:8080/manager/ . 1

"Tomcat Manager" ligipääsu konfigureerimine

Vaikimisi on turvalisuspõhjustel ligipääs haldusrakendusele maha keeratud. Mismoodi täpselt kasutajatel ligipääsu võimaldada sõltub kasutatavast valdusest (realm). Vaikimisi defineerib $CATALINA_BASE/conf/server.xml valduseks "MemoryRealm". Vaikimisi loeb valdus "MemoryRealm" kasutajad failist $CATALINA_BASE/conf/tomcat-users.xml. Antud failis tuleb iga kasutaja defineerida omaette märgendiga <user>, mis näeb välja umbes järgmine 1:

<user name="craig" password="secret" roles="manager-gui,manager-script" />

Antud kasutajale on defineeritud korraga kaks rolli. Ligipääsu võimaldamiseks tulebki lihtsamal juhul kasutajatefailis $CATALINA_BASE/conf/tomcat-users.xml defineerida enda kasutaja. Kasutaja rolliks võib määrata näiteks "manager-gui", mis võimaldab ligipääsu kogu HTML liidese funktsionaalsusele.

Teised valdused on "JDBCRealm", mille puhul hoitakse kasutajatega seonduvat infot andmebaasis ja JNDIRealm, mille puhul kasutatakse lihtsustatud kataloogisirvimise protokolli (LDAP). Lisaks saab haldusrakendusele keelata ligipääsu mujalt kui kindlaksmääratud IP-aadressidelt, lisades filtri "RemoteAddrValve" või "RemoteHostValve" konfigureerimisfaili manager.xml näiteks järgmiselt 1:

<Context privileged="true">
         <Valve className="org.apache.catalina.valves.RemoteAddrValve"
                allow="127\.0\.0\.1"/>
</Context>
Juurutamine ja mahavõtmine haldusrakendusega "Tomcat Manager"

Juurutamiseks lae kõigepealt veebiarhiivifail üles, kasutades esilehel asuvat sektsiooni "WAR file to deploy". Veebiarhiivi üleslaadimise liides on kujutatud plidil 2.

Pilt 2: Veebiarhiivi üleslaadimise nupp

Rakendus kuvatakse seejärel hallatavate rakenduste nimekirjas. Kui konteiner pole seadistatud üleslaetud aplikatsiooni kohe ka ise rakendama, tuleb vajutada "Start". Rakenduse peatamiseks kasuta "Stop", uuesti rakendamiseks "Redeploy" ja serverist eemaldamiseks "Undeploy". Nupud on näha ka pildil 3 olevas rakenduste nimekirjas.

Pilt 3: Rakenduste nimekiri Tomcati haldusrakenduses "Tomcat Manager"

Näpunäiteid Tomcati reaalseks kasutamiseks

Juurutamise järjekord

Tomcati käivitumisel juurutatakse aplikatsioonid sellises järjekorras 2:

  1. Konteinerisse kopeeritud kontekstikirjelduste järgi $CATALINA_BASE/conf/[EngineName]/[HostName]/[ApplicationName].xml ;
  2. Lahtipakitud rakendused "webapps" kataloogis;
  3. Pakitud rakenduste veebiarhiivid "webapps" kataloogis.

Seetõttu peaks käsitsi taasjuurutamisel kindluse mõttes eelnevalt kustutama rakenduse lahtipakitud dokumendipõhja kataloogi "webapps" kataloogist. Kontekstikirjelduse muutumisel tuleb jälgida, kas kirjeldus on juba kopeeritud serverisse ning vajadusel eelmise versiooni ümber muuta või kustutada.

Reaalsele domeenile konfigureerimine

Järgnevalt eeldame, et domeen www.minukodukas.ee on juba serverimasinaga seostatud. Et Tomcat hakkaks ka reaalselt Internetist tulevatele päringutele vastama, tuleb muuta failis $CATALINA_BASE/conf/server.xml konteinerile Catalina vastava teenusemärgendi sisu sarnaselt järgnevaga:

<Service name="Catalina">
   <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />
      <Engine name="Catalina" defaultHost="www.minukodukas.ee">
         <Host name="www.minukodukas.ee"  appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false" xmlValidation="false" xmlNamespaceAware="false">
                <Context path="" docBase="kodukas" debug="0" reloadable="true" />
         </Host>
      </Engine>
</Service>

Ülal defineerime põhiliselt selle, et Tomcat kuulaks domeeni www.minukodukas.ee ja kasutaks HTTP päringute jaoks porti 80. Ühtlasti otsib Tomcat juurutatavat rakendust failist $CATALINA_BASE/webapps/kodukas.war. Kuna rajalisandiks on määratud tühi sõne (path=""), siis juurutataksegi aplikatsioon aadressile www.minukodukas.ee ilma rajalisandita (a'la www.minukodukas.ee/wiki). Seetõttu pakitakse ka veebiarhiiv tegelikult lahti kataloogi $CATALINA_BASE/webapps/ROOT mitte kataloogi $CATALINA_BASE/webapps/kodukas nagu võiks eeldada.

Käigultvahetus

Võimaldamaks käigultvahetust (hot deployment) peab konteineri konfiguratsioonifailis $CATALINA_BASE/conf/server.xml olema peremehepõhise märgendi "Host" atribuudi "autoDeploy" väärtus "true". Sel juhul installeerib ja uuendab Tomcat aplikatsioone dünaamiliselt töötamise ajal. Kui väärtuseks on "false", käib installeerimine staatiliselt ning serverisse juurutamiseks tuleb teha konteineri taaskäivitus. Käigultvahetust saab määrata ka peremehe defineerimisel "Host Manager" rakendusega, mis on kättesaadav aadressil http://localhost:8080/host-manager/html . Kasutamiseks tuleb lisada oma kasutajale rolli "admin-gui" (vt. alajaotus ""Tomcat Manager" ligipääsu konfigureerimine"). Antud rakenduse veebiliides on kujutatud pildil 4.

Pilt 4: Tomcati haldusrakendus "Host Manage"

Käigultvahetust päästikuks on vaikimisi uuendatud veebiarhiivifaili või lahtipakitud veebirakenduse paigutamine "webapps" kataloogi. Käigultvahetuse päästikutele võib failis $CATALINA_BASE/conf/server.xml ka ise lisada kuulatavaid ressursse nagu web.xml muutmine või mõne teegifaili vahetamine (märgendis "Host").

Klassiteekide väljatõstmine veebiarhiivifailist

Kõik konteksti poolt kasutatavad Java klassiteegid võib pakendada veebiarhiivi sisse kataloogi "lib", kuid nii võib osutuda veebiarhiivi üleslaadimine ajakulukaks, eriti arenduskeskkonnas. Kui ei teki ohtu, et erinevad rakendused kasutavad sama teegi erinevaid versioone, siis on vahel parem lisada osa teeke konteineri kataloogi $CATALINA_BASE/libs, kust need tehakse siis konteineri poolt kättesaadavaks kõigile konteineris jooksutatavatele kontekstidele. Nii võib vähendada veebiarhiivi faili suurust märgatavalt, mis tõstab kokkuvõttes juurutamiskiirust ja ühes sellega programmeerijate tööviljakust.

Mälukasutus

Konteineri poolt kasutatavat mälu saab vaadata haldusrakendusest vajutades lingile "Server Status". Mälukasutus on toodud jaotuses "JVM", kus näidatakse nii maksimaalselt kättesaadavat mälu kui ka parasjagu reserveeritud mälu.

Free memory: 41.16 MB Total memory: 123.37 MB Max memory: 1027.56 MB

Mälu suurendamiseks võib näiteks defineerida skriptis $CATALINA_BASE/bin/catalina.sh muutuja "JAVA_OPTS" ning määrata Java mälukasutuse miinimum- ja maksimumväärtused sarnaselt järgnevatega 3:

JAVA_OPTS="-Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m"

Logifailid

Vaikimisi defineerib Tomcat failiga $CATALINA_BASE/conf/logging.properties viis logerit, mis tekitavad viis eraldi logifaili.

Tomcati tekitatavad logifailid "logs" kataloogis
Fail Kasutus
catalina.out Tomcati käivitus- ja peatamisskriptide väljund, samuti juurutatud rakenduste prindilaused System.out ja veaväljundid System.err
catalina.[yyyy]-[mm]-[dd].log Pööratud (rotated) logifail catalina.out
host-manager.[yyyy]-[mm]-[dd].log Logi peremehehalduse rakendusele (rakendus on kättesaadav kohalikust masinast aadressil http://localhost:8080/host-manager/html )
localhost.[yyyy]-[mm]-[dd].log Peremehe "localhost" logi; mitme virtuaalse peremehe korral tekitatakse igale peremehele oma logi
localhost_access_log.[yyyy]-[mm]-[dd].txt Konteinerisse Internetist saabunud päringute logi
manager.[yyyy]-[mm]-[dd].log Haldusrakenduse tegevuste logi

Kokkuvõte

Antud juhend aitab Unix-keskkonnas (ja operatsioonisüsteemi administreerimise algteadmiste olemasolul) Tomcati installeerida, käivitada ja juurutada Tomcatile ka Java näite veebiaplikatsioon. Lisaks on ära toodud ka mõned esmased näpunäited Tomcati kasutamiseks reaalse veebiserverina. Loodetavasti aitab juhend lugeja esmasel kokkupuutel Tomcatiga tekkivatest probleemidest jagu saada ja süveneda iseseisvalt veebiserveri Tomcat põhjalikumasse uurimisse.

Autori märkused

Tööl pole ma kahjuks Tomcati reaalselt kasutada saanud. Kuigi olen tegelenud Java ärirakendustega, on IT-juhtimise poolel seni otsustatud JBoss või Jetty kasuks. Siiski olen oma huviprojekte arendades või Java veebirakenduste tegemist õppides valinud just Tomcati. Seda eelkõige hea integreerituse tõttu IDE-dega. Tomcat töötab näiteks kohe koos NetBeansi installeerimisega, samuti pole kuigi keeruline tööle panna koos Java EE versiooniga Eclipse-ist. Tean ka vähemalt üht Eesti ettevõttet, mis kasutabki Tomcati reaalseks äriteenuste pakkumiseks.

Seni on tundunud Tomcati kasutus läbi IDE mugav, kuid probleemide tekkimisel olen hätta jäänud. Kuna tegemist on siiski Java ärirakendusi toetava veebikonteineriga, mis pakub muu hulgas JNDI-nimeteenust ja andmebaasiühenduste haldamist, siis pole selle ülesehitus sugugi lihtne. Siiski aitab algtõdede teadmine ka lihtsamini lahendada tekkivaid probleeme läbi IDE kasutades.

Viiteid

Palju vajalikku võib leida Tomcat 8 dokumentatsioonist

Lisaks üks viide põhjalikule Tomcati versioon seitsme ülevaatele: http://www.ntu.edu.sg/home/ehchua/programming/howto/Tomcat_More.html

Kasutatud materjalid

  1. http://tomcat.apache.org/tomcat-8.0-doc/index.html
  2. http://www.mulesoft.com/tomcat-deploy-procedures
  3. http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/