Jetty als Service unter Ubuntu einrichten

hier Jetty 9.1.0 mit Ubuntu 13.10


Vorbereitung:

- Hinweis: alle Arbeitsschritte als root user ausführen, ggf. mit sudo.

Voraussetzung JDK 1.7.* ist bereits installiert! JAVA_HOME sollte gesetzt sein.
Beispiel: export JAVA_HOME=/usr/local/java/jdk1.7.0_25 (am besten in /etc/environment eintragen).

Aktuelles Jetty-Installationspaket von http://eclipse.org/jetty/downloads.php herunterladen und nach /opt kopieren.


Jetty installieren:

- Hinweis: auf eine separate Jetty-Base wird verzichtet.

   cd /opt
   
   tar -xvzf jetty-distribution-9.1.0.v20131115.tar.gz
   
   mv jetty-distribution-9.1.0.v20131115/ jetty
   
   cd /opt/jetty
   
   mkdir temp
		

Jetty initialisieren:

- bitte sicherstellen, daß java aus der korrekten Runtime bzw. dem entsprechenden JDK verwendet wird.

   java -jar start.jar --add-to-startd=http,deploy
   
   java -jar start.jar --add-to-startd=https
		

Benutzer anlegen und Zugriffsrechte setzen:

- im regulären Betrieb führt nicht root, sondern der Benutzer jetty den Service aus.

   useradd --user-group --shell /bin/false --home-dir /opt/jetty/temp jetty

   chown --recursive jetty /opt/jetty
		

Service anlegen und konfigurieren:

das im Jetty-Installationspaket enthaltene Service-Start-Script nach /etc/init.d kopieren:

   cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty
        
neue Datei: vi /etc/default/jetty
   --------------------------------------------------------
   JAVA=/usr/local/java/jdk1.7.0_25/bin/java # Path to Java
   NO_START=0 # Start on boot
   JETTY_HOME=/opt/jetty
   JETTY_BASE=/opt/jetty
   TMPDIR=/opt/jetty/temp
   JETTY_HOST=0.0.0.0 # Listen to all hosts
   JETTY_ARGS=jetty.port=10080
   JETTY_USER=jetty # Run as this user
   --------------------------------------------------------
        

Service testen:

- Tip: zum Testen den Text-Browser Lynx installieren: apt-get install lynx

   service jetty start
   Starting Jetty: OK Di 21. Jan 10:33:31 CET 2014
   Jetty running pid=3291
        
Test mit Browser: lynx http://localhost:10080
   service jetty status
   service jetty check
        
beide Ausgaben enthalten eine Zeile wie "Jetty running pid=3291".

beenden: service jetty stop
Sopping Jetty: OK


Jetty an Service-Port 80 betreiben:

Port 80 ist der Standard-Port für Webserver. Daher ist dies ein Privileg von root. Da der Service von Benutzer jetty ausgeführt werden soll, muß der konfigurierte Port 10080 auf Port 80 umgeleitet werden. Dies erfolgt mit Hilfe des Service-Programms Xinetd.

Xinetd installieren: apt-get install xinetd

neue Datei: vi /etc/xinetd.d/redirect80
   --------------------------------------------------------
   service redirect_80
   {
      disable = no
      socket_type = stream
      protocol = tcp
      user = root
      wait = no
      port = 80
      redirect = localhost 10080
      type = UNLISTED
   } 
   --------------------------------------------------------
   
   /etc/init.d/xinetd restart
        
testen: service jetty start

Browser: lynx http://localhost

service jetty stop


Jetty-Service beim System-Boot starten:

   update-rc.d jetty defaults
        
( update-rc.d -f jetty remove zum Entfernen aus dem Systemstart )

Zum Testen das System booten.

Obwohl der Service manuell startbar ist kommt es oft vor, daß der Service nicht beim Booten des Systems gestartet wird. Dies scheint in irgendeiner Weise mit der konkreten Linux-Installation, den Eigenarten und der Konfiguration des lokalen Netzwerks und des installierten Software-Portfolios zusammenzuhängen. Zu dem Zeitpunkt, zu dem Jetty gestartet werden soll, steht offenbar eine benötigte System-Ressource noch nicht zur Verfügung, so daß der Start des Services fehlschlägt. Anders formuliert: der Service-Start wird während des Bootens zu früh ausgelöst. Jetty steht dann nach dem Booten nicht zur Verfügung. Die genaue Ursache ist hier nicht bekannt, aber folgender Workaround hat sich als zuverlässig erwiesen:

"at" Scheduler installieren: apt-get install at

Zwei kleine Shellscripte anlegen:

1. vi /opt/jetty/start_jetty.sh

   -----------------------------
   #!/bin/sh
   service jetty start
   -----------------------------
           

2. vi /opt/jetty/schedule_jetty.sh
   ----------------------------------------
   #!/bin/sh
   at -f /opt/jetty/start_jetty.sh now+1min
   ----------------------------------------
           

Dann in /etc/rc.local den Eintrag
   /opt/jetty/schedule_jetty.sh
           
hinzufügen.

Dies verzögert den Start von Jetty um eine Minute, wodurch sichergestellt wird, daß zum Startzeitpunkt von Jetty der Bootvorgang vollständig abgeschlossen ist und alle erforderlichen System- und Netzwerkressourcen verfügbar sind.



Referenzen:

http://www.eclipse.org/jetty/documentation/current/startup-unix-service.html

http://pietervogelaar.nl/ubuntu-12-04-install-jetty-9/

http://blog.knoldus.com/2013/05/29/quick-tip-how-to-make-jetty-webserver-listen-on-port-80-as-a-non-root-user/