{"id":138,"date":"2014-03-19T22:04:17","date_gmt":"2014-03-19T20:04:17","guid":{"rendered":"http:\/\/grenzdebiel.dyndns.org\/wordpress\/?p=138"},"modified":"2015-08-11T04:19:21","modified_gmt":"2015-08-11T02:19:21","slug":"tomcat-application-server","status":"publish","type":"post","link":"https:\/\/blog.grenzdebiel.dynv6.net\/?p=138","title":{"rendered":"Tomcat &#8211; Application-Server"},"content":{"rendered":"<p><strong>Tomcat<\/strong> ist ein Java Application Server welcher in Java\/JavaScript geschriebene Programme ausf\u00fchrt.<\/p>\n<p>Als erstes gilt es eine Umgebung f\u00fcr den Appl-Server zu schaffen. Wir ben\u00f6tigen eine geeignete JavaRuntime Umgebung.<br \/>\n<!--more--><\/p>\n<p>Sucht euch bitte die passende Version auf der Seite: http:\/\/www.oracle.com\/technetwork\/java\/javase\/downloads\/index.html<\/p>\n<p>F\u00fcr den Raspberry Pi w\u00e4re das:<br \/>\n<a href=\"http:\/\/www.oracle.com\/technetwork\/java\/embedded\/downloads\/javase\/index.html\" target=\"_blank\">http:\/\/www.oracle.com\/technetwork\/java\/embedded\/downloads\/javase\/index.html<\/a> &#8211; &#8222;ARMv6\/7 Linux &#8211; Headless &#8211; Client Compiler EABI, VFP, HardFP ABI, Little Endian1&#8220;.<\/p>\n<p>Da Oracle unbedingt Cookie setzen will zum abnicken der AGBs kann man das ganze nicht ganz so einfach mit wget laden man braucht noch was drumherum:<\/p>\n<p>RaspberryPi<br \/>\n<code>wget --no-cookies --no-check-certificate --header \"Cookie: gpw_e24=http:\/\/www.oracle.com\/\" \"http:\/\/download.oracle.com\/otn\/java\/ejre\/7u51-b13\/ejre-7u51-fcs-b13-linux-arm-vfp-hflt-client_headless-18_dec_2013.tar.gz<\/code><\/p>\n<p>f\u00fcr Linux 64bit:<br \/>\n<code>wget --no-cookies --no-check-certificate --header \"Cookie: gpw_e24=http:\/\/www.oracle.com\/\" \"http:\/\/download.oracle.com\/otn-pub\/java\/jdk\/7u51-b13\/jdk-7u51-linux-x64.tar.gz\"<\/code><\/p>\n<p>Installation von Java auf eurem System:<\/p>\n<pre class=\"lang:sh decode:true brush: bash; gutter: false; first-line: 1;\">mkdir \/usr\/lib\/jvm\r\ncd \/usr\/lib\/jvm\r\ntar xfz jre-7u51-linux-x64.tar.gz #64bit Linux\r\ntar xfz jdk-7u51-linux-arm-vfp-hflt.tar.gz #RaspberryPi\r\nln -s \/usr\/lib\/jvm\/jre1.7.0_51\/ \/usr\/lib\/jvm\/java\r\nupdate-alternatives --install \"\/usr\/bin\/java\" \"java\" \"\/usr\/lib\/jvm\/java\/bin\/java\" 1 #Oracle Java zum Standard<\/pre>\n<p>Ein &#8222;<code>java -version<\/code>&#8220; sollte soetwas ausgeben(auf RaspberryPi):<br \/>\n<code>java version \"1.7.0_51\"<br \/>\nJava(TM) SE Runtime Environment (build 1.7.0_51-b13)<br \/>\nJava HotSpot(TM) Client VM (build 24.51-b03, mixed mode)<\/code><\/p>\n<p>Damit w\u00e4re die umgebung f\u00fcr Tomcat fertig. Jetzt geht es mit der eigentlichen installation von Tomcat los.<\/p>\n<p>&#8222;Aktuellen&#8220; Tomcat herunterladen <a href=\"http:\/\/tomcat.apache.org\/download-70.cgi\" target=\"_blank\">http:\/\/tomcat.apache.org\/download-70.cgi<\/a><br \/>\n<code>wget http:\/\/www.eu.apache.org\/dist\/tomcat\/tomcat-7\/v7.0.42\/bin\/apache-tomcat-7.0.42.tar.gz<\/code><\/p>\n<p>Ich installiere es auf einer eigenen partition welche ich nach \/tomcat mounte.<\/p>\n<pre class=\"lang:sh decode:true brush: bash; gutter: false; first-line: 1;\">cd \/\r\ntar xfz apache-tomcat-7.0.42.tar.gz\r\nmv \/apache-tomcat-7.0.42 \/tomcat\r\nchown -R tomcat:tomcat \/tomcat\r\nchmod +x \/tomcat\/bin\/*.sh<\/pre>\n<p>Jetzt kann man ihn schon fast starten, hier ein Script welches ich mir auch nur von &#8222;http:\/\/www.SysADMINsLife.com&#8220; kopiert und etwas angepasst habe:<br \/>\n<strong>tomcat:<\/strong><\/p>\n<pre class=\"lang:sh decode:true brush: bash; gutter: true; first-line: 1;\">### BEGIN INIT INFO\r\n# Provides: tomcat\r\n# Required-Start: $local_fs $remote_fs $network\r\n# Required-Stop: $local_fs $remote_fs $network\r\n# Should-Start: $named\r\n# Should-Stop: $named\r\n# Default-Start: 2 3 4 5\r\n# Default-Stop: 0 1 6\r\n# Short-Description: Start Tomcat Server\r\n# Description: Start the Tomcat Server\r\n### END INIT INFO\r\n######################################\r\n# customize values for your needs\r\n \r\nJRE_HOME=\"\";\r\nJAVA_HOME=\"\/usr\/lib\/jvm\/java\";\r\n \r\nTOMCAT_USER=tomcat;\r\nTOMCAT_PATH=\/tomcat;\r\nSHUTDOWN_TIME=60\r\nCATALINA_OPTS=\"-Dcom.sun.management.jmxremote.port=8090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false\"\r\nexport JAVA_OPTS\r\nexport CATALINA_OPTS\r\n \r\nif [ -n \"$JAVA_HOME\" ] &amp;&amp; [ -n \"$JRE_HOME\" ] ; then\r\n        echo \"JAVA_HOME and JRE_HOME is set.\r\nChoose one of them.\r\n \r\nJAVA_HOME=$JAVA_HOME\r\nJRE_HOME=$JRE_HOME\r\n \r\nAbort starting Tomcat.\"\r\n        exit 1;\r\nfi\r\n \r\nif [ -n \"$JAVA_HOME\" ] ; then\r\n        JAVA_VERSION=$($JAVA_HOME\/bin\/java -version 2&gt;&amp;1|grep \"java version\"|awk {'print $3'}|cut -d\".\" -f 2);\r\n        export JAVA_HOME;\r\nfi\r\n \r\nif [ -n \"$JRE_HOME\" ] ; then\r\n        JAVA_VERSION=$($JRE_HOME\/bin\/java -version 2&gt;&amp;1|grep \"java version\"|awk {'print $3'}|cut -d\".\" -f 2);\r\n        export JRE_HOME;\r\nfi\r\n \r\nif [ $JAVA_VERSION -gt 7 ] ; then\r\n        JAVA_OPTS=\"-Djava.awt.headless=true -Xms64m -Xmx256m\";\r\nelse\r\n        JAVA_OPTS=\"-Djava.awt.headless=true -Xms64m -Xmx256m -XX:MaxPermSize=128m\";\r\nfi\r\n \r\ntomcat_pid() {\r\n        echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'`\r\n}\r\n \r\nstart() {\r\n        if [ -f $TOMCAT_PATH\/bin\/startup.sh ];\r\n        then\r\n                pid=$(tomcat_pid)\r\n                if [ -n \"$pid\" ]\r\n                then\r\n                        echo \"Start aborted because Tomcat already running with pid: $pid\"\r\n                else\r\n                        echo \"Starting Tomcat\"\r\n                        \/bin\/su $TOMCAT_USER -c $TOMCAT_PATH\/bin\/startup.sh\r\n                fi\r\n        else\r\n                echo \"$TOMCAT_PATH\/bin\/startup.sh does not exist - Please check your config\"\r\n        fi\r\n \r\n        return 0\r\n}\r\n \r\nstop() {\r\n        if [ -f $TOMCAT_PATH\/bin\/shutdown.sh ];\r\n        then\r\n                pid=$(tomcat_pid)\r\n                if [ -n \"$pid\" ]\r\n                then\r\n                        echo \"Stopping Tomcat\"\r\n                        \/bin\/su $TOMCAT_USER -c $TOMCAT_PATH\/bin\/shutdown.sh\r\n                        let waitfor=$SHUTDOWN_TIME\r\n                        count=0;\r\n                        until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $waitfor ]\r\n                        do\r\n                                echo -n -e \"\\rWaiting $count of $waitfor seconds for Tomcat to exit until process kill \";\r\n                                sleep 1\r\n                                let count=$count+1;\r\n                        done\r\n                        if [ $count -gt $waitfor ]; then\r\n                                echo -n -e \"\\nKilling Tomcat which didn't stop after $SHUTDOWN_TIME seconds\"\r\n                                kill -9 $pid\r\n                        fi\r\n                else\r\n                        echo \"Your Tomcat Instance is not running\"\r\n                fi\r\n        else\r\n                echo \"$TOMCAT_PATH\/bin\/shutdown.sh does not exist - Please check your config\"\r\n        fi\r\n        return 0\r\n}\r\n \r\ncase $1 in\r\nstart)\r\n        start\r\n;;\r\nstop)\r\n        stop\r\n;;\r\nrestart)\r\n        stop\r\n        start\r\n;;\r\nstatus)\r\n        pid=$(tomcat_pid)\r\n        if [ -n \"$pid\" ]\r\n        then\r\n                echo \"Your Tomcat Instance is running with pid: $pid\"\r\n        else\r\n                echo \"Your Tomcat Instance is not running\"\r\n        fi\r\n;;\r\n*)\r\n        echo \"Usage: $0 { start | stop | restart | status }\"\r\n;;\r\nesac\r\nexit 0<\/pre>\n<p>Dieses Skript noch ausf\u00fchrbar machen <code>chmod +x tomcat<\/code> und dann ausf\u00fchren <code>.\/tomcat start<\/code>.<\/p>\n<p>Nun im Logfile verfolgen ob er wirklich startet mit <code>tail -f \/tomcat\/logs\/catalina.out<\/code> und warten bis folgende Ausgabe erscheint:<\/p>\n<pre class=\"lang:sh decode:true\">Mrz 19, 2014 2:22:05 PM org.apache.coyote.AbstractProtocol start\r\nInformation: Starting ProtocolHandler [\"http-bio-8282\"]\r\nMrz 19, 2014 2:22:05 PM org.apache.coyote.AbstractProtocol start\r\nInformation: Starting ProtocolHandler [\"ajp-bio-8009\"]\r\nMrz 19, 2014 2:22:05 PM org.apache.catalina.startup.Catalina start\r\nInformation: Server startup in 2589 ms<\/pre>\n<p>Jetzt kann man im Browser unter der URL &#8222;<code>http:\/\/&lt;servername&gt;:8080<\/code>&#8220; den Tomcat bewundern. Wenn er l\u00e4uft stoppen mit <code>.\/tomcat stop<\/code> und noch etwas hand anlegen.<br \/>\nAls ersters solltet ihr das Script nach <code>\/etc\/init.d\/<\/code> kopieren und mit <code>update-rc.d tomcat defaults 99 01<\/code> dem init-Prozess bekannt machen bzw. automatisch starten lassen.<\/p>\n<p>1. Benutzer anlegen f\u00fcr &#8222;Server-Status\/Manager GUI&#8220;:<br \/>\n<code>vi \/tomcat\/conf\/tomcat-users.xml<\/code> und folgendes in den Abschnitt <code>&lt;tomcat-users&gt;<\/code> hinzuf\u00fcgen:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;role rolename=\"manager\"\/&gt;;\r\n   &lt;role rolename=\"manager-gui\"\/&gt;\r\n   &lt;role rolename=\"admin\"\/&gt;\r\n   &lt;user username=\"&lt;USERNAME&gt;\" password=\"&lt;PASSWORD&gt;\" roles=\"admin,manager,admin-gui,manager-gui\"\/&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p>und schon k\u00f6nnt ihr euch unter der URL &#8222;<code>http:\/\/&lt;servername&gt;:8080\/manager\/<\/code>&#8220; mit den Credentials anmelden.<\/p>\n<p>2. Wenn euch das Standard-Logging welches f\u00fcr jeden Tag ein eigenes Log \u00f6ffnet st\u00f6rt kann folgendes hinzuf\u00fcgen:<br \/>\n<strong>\/tomcat\/conf\/logging.properties:<\/strong><\/p>\n<pre class=\"lang:sh decode:true\">1catalina.org.apache.juli.FileHandler.rotatable = false\r\n2localhost.org.apache.juli.FileHandler.rotatable = false\r\n3manager.org.apache.juli.FileHandler.rotatable = false\r\n4host-manager.org.apache.juli.FileHandler.rotatable = false\r\n\r\n1catalina.org.apache.juli.FileHandler.suffix = log\r\n2localhost.org.apache.juli.FileHandler.suffix = log\r\n3manager.org.apache.juli.FileHandler.suffix = log\r\n4host-manager.org.apache.juli.FileHandler.suffix = log<\/pre>\n<p>3. Wenn ihr euren Tomcat nicht direkt an das Netz h\u00e4ngen wollt k\u00f6nnt ihr die Anfragen vorher mit dem Apache oder nginx abfangen und an den Tomcat weiterleiten so ist kann man noch einige Dinge beeinflussen wie Rewrite der URL, vhosts usw.<\/p>\n<p>Ich nutze den nginx als ReverseProxy f\u00fcr den Tomcat. Der Tomcat darf nicht auf dem port vom <a title=\"nginx \u2013 Webserver\" href=\"http:\/\/grenzdebiel.dyndns.org\/wordpress\/?p=34\">nginx<\/a> laufen.<\/p>\n<p>Hier m\u00fcssen am Tomcat und an nginx Ver\u00e4nderungen vorgenommen werden.<\/p>\n<p>Am Tomcat:<br \/>\n<strong>\/tomcat\/conf\/server.xml<\/strong> (innerhalb von Server-&gt;Service-&gt;Engine-&gt;Host):<br \/>\nEventuell Port \u00e4ndern:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;Connector port=\"8080\" protocol=\"HTTP\/1.1\"\r\n               connectionTimeout=\"20000\"\r\n               redirectPort=\"8443\" \/&gt;<\/pre>\n<p>hier &#8218;port=&#8220;8080&#8243;&#8218; auf ein nicht besetzten \u00fcber 1024 liegenden Port wechseln.<\/p>\n<p>Wenn im logging korrekte IPs erscheinen sollen dies hinzuf\u00fcgen:<br \/>\n<strong>\/tomcat\/conf\/server.xml:<\/strong><\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;Valve className=\"org.apache.catalina.valves.RemoteIpValve\"\r\n                internalProxies=\"127\\.0\\.0\\.1\"\r\n                remoteIpHeader=\"x-forwarded-for\"\r\n                proxiesHeader=\"x-forwarded-by\"\r\n                trustedProxies=\"127.0.0.1\"\r\n                protocolHeader=\"x-forwarded-proto\"&gt;<\/pre>\n<p>Dies sorgt daf\u00fcr das ein vom Proxy\/Reverse Proxy gesetzter &#8222;x-forwarded-for&#8220; Eintrag im Header welcher die echte IP des anfragenden Clients ist auswertet und verarbeitet. So ist im access-log des Tomcat die echte Client-IP gesetzt und nicht die des Proxy.<\/p>\n<p>Damit sind die arbeiten an der Tomcat-konfig abgeschlossen.<br \/>\nDer nginx wird wie folgt zum Reverse Proxy konfiguriert:<br \/>\n<strong>\/etc\/nginx\/sites-available\/default:<\/strong><\/p>\n<pre class=\"lang:ini decode:true\">server {\r\n        listen *:80;\r\n        server_name ;\r\n        root \/tomcat\/webapps\/;\r\n\r\n        location \/ {\r\n\r\n                proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;\r\n                proxy_set_header   X-Forwarded-Proto $scheme;\r\n                proxy_set_header   Host              $http_host;\r\n                proxy_set_header   X-Real-IP         $remote_addr;\r\n                proxy_set_header   CLIENT_IP         $remote_addr;\r\n                proxy_pass http:\/\/127.0.0.1:8080\/;\r\n        }\r\n}<\/pre>\n<p>Beide Dienste werden neugestartet bzw. beim nginx reloaded und unter der URL <code>\"http:\/\/&lt;servername&gt;\"<\/code> sollte euer Tomcat \u00fcber nginx erreichbar sein.<\/p>\n<p>4. Der Tomcat kann \u00fcber die Zeile <code>\"JAVA_OPTS=\"-Djava.awt.headless=true -Xms32m -Xmx64m -XX:MaxPermSize=96m\"\"<\/code> im Start-Skript konfiguriert werden.<\/p>\n<p>Hier wurde festgelegt das Java mit 32MByte initialisiert wird(-Xms) und maximal 64MByte verbrauchen darf(-Xmx). Mit <code>\"-XX:MaxPermSize=96m\"<\/code> legt man den PermGenSpace fest dies ist der &#8222;Heap Space&#8220; hier werden die Classen abgelegt. Bei gr\u00f6sseren Projekten kann es zu OutOfMemory kommen weil nicht alle Classen geladen werden k\u00f6nnen. Wird dieser nicht angegeben wird der Standard benutzt: 64MByte.<\/p>\n<p>Zu guter letzt sollte dem Tomcat noch ein Programm hinzugef\u00fcgt werden.<br \/>\nLade dazu &#8222;psi probe&#8220; herunter: <a href=\"https:\/\/code.google.com\/p\/psi-probe\/\">https:\/\/code.google.com\/p\/psi-probe\/<\/a> entpacken die zip-Datei und kopieren die enthaltene probe.war-Datei nach <code>\/tomcat\/webapps\/<\/code>. F\u00fchre wieder ein <code>tail -f \/tomcat\/logs\/catalina.out<\/code> aus und sehe zu wie die App. deployed wird. Nach erfolgreicher Installation kann man dies unter <code>http:\/\/&lt;servername&gt;\/probe\/<\/code> bewundern.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Update 19.07.:<\/strong><\/span><\/p>\n<p>Wenn man das jdk 8 haben m\u00f6chte l\u00e4dt man dies so:<br \/>\n<code>curl -L --header \"Cookie: s_nr=1405796959315; s_cc=true; gpw_e24=http%3A%2F%2Fwww.oracle.com%2Ftechnetwork%2Fjava%2Fjavase%2Fdownloads%2Fjdk8-arm-downloads-2187472.html; s_sq=oracleotnlive%2Coracleglobal%3D%2526pid%253Dotn%25253Aen-us%25253A%25252Fjava%25252Fjavase%25252Fdownloads%25252Fjdk8-arm-downloads-2187472.html%2526pidt%253D1%2526oid%253Dfunctiononclick(event)%25257BacceptAgreement(window.self%25252C'jdk-8-oth-JPR')%25253B%25257D%2526oidt%253D2%2526ot%253DRADIO; oraclelicense=accept-securebackup-cookie; testSessionCookie=Enabled\" http:\/\/download.oracle.com\/otn-pub\/java\/jdk\/8u6-b23\/jdk-8u6-linux-arm-vfp-hflt.tar.gz -o jdk-8u6-linux-arm-vfp-hflt.tar.gz<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tomcat ist ein Java Application Server welcher in Java\/JavaScript geschriebene Programme ausf\u00fchrt. Als erstes gilt es eine Umgebung f\u00fcr den Appl-Server zu schaffen. Wir ben\u00f6tigen eine geeignete JavaRuntime Umgebung.<\/p>\n","protected":false},"author":3,"featured_media":166,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,12],"tags":[33,19,34,32],"class_list":["post-138","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-software-pi","tag-java","tag-raspberry-pi-2","tag-raspberrypi","tag-tomcat"],"_links":{"self":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=138"}],"version-history":[{"count":2,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/138\/revisions"}],"predecessor-version":[{"id":260,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/posts\/138\/revisions\/260"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=\/wp\/v2\/media\/166"}],"wp:attachment":[{"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.grenzdebiel.dynv6.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}