Konfigurieren Sie die Yosemite Server WebApp mit LaunchD

Frage

Konnte jemand erfolgreich eine Webapp über eine webappctlKonfiguration starten, die eine Launchd-Konfiguration in ihrem Schlüssel angibt webapp.plist launchKeys?

Hintergrund

Insbesondere wenn Server.app installiert ist, kann man theoretisch benutzerdefinierte Webanwendungen konfigurieren, die in der Server.app-GUI unter den „Erweiterten Einstellungen“ einer Website-Konfiguration angezeigt werden.

ReadMe.txtWenn Sie sich das ansehen, /Library/Server/Web/Config/apache2gibt es einen Abschnitt, in dem es heißt:

webapps/

This directory contains the webapp.plist files for all defined webapps.
See the man page for webapp.plist(8) and webappctl(8).
(Server app man pages are present in /Applications/Server.app/Contents/ServerRoot/usr/share/man/.)

Administrators are strongly encouraged to use the webapp mechanism
instead of modifying virtual host config files directly.
In general, you can place Apache configuration directives in an "Include" file,
and create a webapp.plist file that references that Include file.
You can then activate or de-activate that Include file for the default
sites, or for specific custom sites, by using webappctl(8).

Sie können die man-Einträge auch lesen, wie in der ReadMe.txt durch diese Terminalbefehle vorgeschlagen:

man -M /Applications/Server.app/Contents/ServerRoot/usr/share/man/ webapp.plist
man -M /Applications/Server.app/Contents/ServerRoot/usr/share/man/ webappctl

Es gibt auch eine Beispiel-Webapp-Konfiguration /Library/Server/Web/Config/apache2/com.example.mywebapp.plist, die einige Kommentare dazu enthält, wie diese plist konfiguriert werden könnte.

Aufstellen

webapp.plistIn meinem Fall habe ich dem Verzeichnis eine hinzugefügt /Library/Server/Web/Config/apache2/, die so aussieht:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<!-- See man pages for webapp.plist(5) and webappctl(8) for information about webapp.plist -->

<plist version="1.0">
<dict>
  <key>includeFiles</key>
    <array/> <!-- Include files are activated in virtual host when webapp is started -->
  <key>launchKeys</key>
    <array> <!-- Launchd plists in /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons are loaded when webapp is started -->
      <string>org.levi.foo</string>
    </array>
  <key>name</key>
    <string>org.apache.tomcat</string>
  <key>displayName</key> <!-- Name shown in Server app -->
    <string>Tomcat</string>
  <key>proxies</key> <!-- ProxyPass/ProxyPassReverse directives are activated when webapp is started -->
    <dict/>
  <key>requiredModuleNames</key>
    <array/>
  <key>installationIndicatorFilePath</key> <!-- The presence of this file indicates web app is installed -->
    <string>/Library/Tomcat/Home/bin/catalina.sh</string>
  <key>sslPolicy</key> <!-- Determines webapp SSL behavior -->
    <integer>0</integer> <!-- 0: default, UseSSLWhenEnabled -->
  <!-- 1: UseSSLAlways -->
  <!-- 2: UseSSLOnlyWhenCertificateIsTrustable -->
  <!-- 3: UseSSLNever -->
  <!-- 4: UseSSLAndNonSSL -->
</dict>
</plist>

Achten Sie besonders auf:

<key>launchKeys</key>
  <array>
  <string>org.levi.foo</string>
</array>

which spezifiziert my launchd.plistwhich befindet sich unter /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plistund sieht so aus:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
    <string>org.levi.foo</string>
      <key>RunAtLoad</key>
        <true/>
<key>Program</key>
    <string>/Library/Tomcat/start.sh</string>
</dict>
</plist>

was einfach das Skript aufrufen sollte, /Library/Tomcat/start.shdas einfach ist:

#!/bin/bash

BASENAME=`basename $0`
LOGGER_B="/usr/bin/logger"

function log {
  MESSAGE="$1"
  ${LOGGER_B} -i -p daemon.notice -t ${BASENAME} ${MESSAGE}
}

log "Here I am!"

Ausgabe

Wenn ich verwende launchctl, um das manuell zu laden org.levi.foo.plist:

$ sudo launchctl load org.levi.foo.plist

Ich bekomme die erwartete Nachricht in /var/log/system.log:

Apr  2 16:12:01 host sudo[85791]:     levi : TTY=ttys000 ; PWD=/Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons ; USER=root ; COMMAND=/bin/launchctl load org.levi.foo.plist
Apr  2 16:12:01 host start.sh[85795]: Here I am!

Wenn ich jedoch webappctlmeine Webapp-Konfiguration (oben) starte:

$ sudo webappctl start org.apache.tomcat

Ich bekomme einen Fehler in /var/log/system.log:

Apr  2 16:18:46 host sudo[85904]:     levi : TTY=ttys000 ; PWD=/Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons ; USER=root ; COMMAND=/Applications/Server.app/Contents/ServerRoot/usr/sbin/webappctl start org.apache.tomcat
Apr  2 16:18:47 host serverctl[85914]: ERROR: The operation couldn’t be completed. Operation not permitted
Apr  2 16:18:49 host serverctl[85915]: ERROR: The operation couldn’t be completed. Operation not permitted
Apr  2 16:18:49 host servermgr_web[85908]: XSWebConfig:ERROR: Failed on second attempt to load /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plist

und ich sehe mein "Hier bin ich!" Nachricht.

Dies scheint darauf hinzudeuten, dass my launchd.plistes nicht so weit schafft, das Skript auszuführen, wenn ich versuche, über zu starten webappctl, aber ich habe keine Ahnung, welche Operation nicht abgeschlossen werden konnte oder warum nicht. Alle Dateien, die ich erwähnt habe, sind im Besitz von root:wheelmit rw-r--r--Berechtigungen, mit Ausnahme des Skripts, das rwx-r-xr-x.

Welche Magie muss also ausgeführt werden, damit meine Webapp meine launchd-Konfiguration beim Start/Stopp lädt/entlädt?

Randnotiz: Offensichtlich sind diese Konfigurationen und Skripte einfache Beispiele, die ich zu Debugging-Zwecken und zur Vereinfachung der Details hier verwendet habe. In Wirklichkeit versuche ich, eine Instanz von Tomcat als "Webapp" einzurichten, die hinter Apache 2 auf meinem Server ausgeführt wird, sodass ich echte Web-Apps über Tomcat bereitstellen und im Web bereitstellen kann.)

Nebenbemerkung 2: Ich weiß, dass ich my launchd.plistin installieren /Library/LaunchDaemonsund das launchKeysvon my webapp.plistals Problemumgehung weglassen kann, aber dies erlaubt mir nicht, die Webapp über Server.app (oder das Befehlszeilenäquivalent) zu starten/stoppen, und ich meine, es sollte funktionieren, oder?

Vielen Dank,

Levi

(Crosspost von https://discussions.apple.com/message/27946624 )

@klanomath Danke. Ein Copy-Paste-Fehler. Ich habe es im Beitrag korrigiert.
Nachdem Sie Ihr Beispiel in einer VM eingerichtet haben, webappctl start org.apache.tomcatfunktioniert der Befehl einfach. Vielleicht ist es irgendein Caching-Problem. Haben Sie versucht, Ihren Mac neu zu starten/die Caches zu leeren? Oder den Webserver neu starten?
@klanomath Danke, ich habe noch nicht neu gestartet ... werde es versuchen. Hast du das "Hier bin ich!" Nachricht rein /var/log/system.log? Um es klar zu sagen, es gibt keinen Fehler von webappctl start org.apache.tomcat(es scheint zu funktionieren), aber der Fehler manifestiert sich in dem, system.logwie ich es dokumentiert habe.
Ja, ich habe mehrere "Here I am"-Meldungen im system.log erhalten. Die von sudo launchctl load org.levi.foo.plist(natürlich) und auch von sudo webappctl start org.apache.tomcat. Nachdem Sie letzteres ausgeführt haben, erhalten Sie auch eine 3-Zeilen-Antwort in Ihrer Shell, die besagt, dass org.apache.tomcat jetzt RUNNING ist.
Ach du meine Güte. @klanomath, vielen Dank für dein zweites Augenpaar und den Vorschlag zum Neustart. Ein Neustart der Maschine und jetzt funktioniert es so, wie ich es erwartet habe.
Gern geschehen :-). Jetzt kannst du eine Antwort schreiben und ich werde sie positiv bewerten ;-)

Antworten (1)

Es stellt sich heraus, dass das Setup, das ich in meiner Frage gestellt habe, korrekt ist und wie erwartet funktioniert. Dies wurde von @klanomath bestätigt, der meine Konfiguration reproduzieren und sehen konnte, dass die Dinge wie erwartet funktionierten. Speziell:

Nach Ausgabe:

$ sudo webappctl start org.apache.tomcat

Ich bekomme das erwartete "Hier bin ich!" Nachricht ein /var/log/system.log.

Die Lösung für mich war, einfach meinen Computer neu zu starten.

Beachten Sie, dass anscheinend die Launchd-Konfigurationen in /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/irgendwie zwischengespeichert zu sein scheinen und dort vorgenommene Änderungen nicht übernommen werden, webappctlbis etwas * neu gestartet wird.

Hoffentlich wird dies jemandem den Tag ersparen, den ich brauchte, um ein sanftes "Haben Sie versucht, neu zu starten?" Vorschlag, das Problem zu lösen.

Levi

* Ich bin mir nicht sicher, was neu gestartet werden muss ... Ich habe versucht, den Webserver und Server.app zu starten und zu stoppen und die Web-App über die GUI von Settings.app zu aktivieren und zu deaktivieren, ohne Erfolg. Das einzige, was die Änderungen aufgegriffen hat, war ein vollständiger Neustart des Systems.