Skonfiguruj aplikację internetową Yosemite Server za pomocą LaunchD

4

Pytanie

Czy ktoś mógł uruchomić aplikację internetową za pomocą webappctlkonfiguracji, która określa uruchomioną konfigurację w swoim webapp.plist launchKeyskluczu?

tło

W szczególności po zainstalowaniu Server.app można teoretycznie skonfigurować niestandardowe aplikacje internetowe, które pojawiałyby się w GUI Server.app w „Ustawieniach zaawansowanych” konfiguracji strony internetowej.

Jeśli spojrzeć na ReadMe.txtIN /Library/Server/Web/Config/apache2istnieje sekcja który stanowi:

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).

Możesz również odczytać wpisy man, zgodnie z sugestią w pliku ReadMe.txt za pomocą następujących poleceń terminalu:

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

Istnieje również przykładowa konfiguracja aplikacji internetowej, /Library/Server/Web/Config/apache2/com.example.mywebapp.plistktóra zawiera kilka komentarzy na temat tego, jak ten plist można skonfigurować.

Ustawiać

W moim przypadku dodałem webapp.plistdo /Library/Server/Web/Config/apache2/katalogu, który wygląda następująco:

<?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>

Zwracając szczególną uwagę na:

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

który określa mój, launchd.plistktóry znajduje się /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plisti wygląda następująco:

<?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>

który powinien po prostu wywołać skrypt, /Library/Tomcat/start.shktóry jest po prostu:

#!/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!"

Kwestia

Jeśli użyję launchctldo ręcznego załadowania org.levi.foo.plist:

$ sudo launchctl load org.levi.foo.plist

Otrzymuję oczekiwaną wiadomość w /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!

Jeśli jednak webappctlużyję do uruchomienia konfiguracji aplikacji internetowej (powyżej):

$ sudo webappctl start org.apache.tomcat

Pojawia się błąd w /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

i nie widzę mojego „Oto jestem!” wiadomość.

To wydaje się wskazywać, że mój launchd.plistnie posuwa się tak daleko, jak uruchomienie skryptu podczas próby uruchomienia webappctl, ale nie mam pojęcia, która operacja nie może zostać zakończona lub dlaczego. Wszystkie pliki, o których wspomniałem, są własnością root:wheelz rw-r--r--uprawnieniami, z wyjątkiem skryptu, którym jest rwx-r-xr-x.

Jaką magię należy wykonać, aby moja aplikacja internetowa ładowała / zwalniała moją uruchomioną konfigurację podczas uruchamiania / zatrzymywania?

Uwaga dodatkowa: Oczywiście te konfiguracje i skrypty są prostymi przykładami, których użyłem do celów debugowania i uproszczenia szczegółów tutaj. W rzeczywistości próbuję podnieść instancję Tomcata jako „aplikację internetową”, która będzie działać za Apache 2 na moim serwerze, aby móc wdrażać prawdziwe aplikacje internetowe za pośrednictwem Tomcat i udostępniać je w Internecie).

Notatka 2: Wiem, że mogę zainstalować mój launchd.plistin /Library/LaunchDaemons, a pominięcie launchKeysz mojego webapp.plistjako obejście, ale nie pozwala mi start / stop webapp poprzez Server.app (lub równowartość wiersza poleceń), a to znaczy, to powinno działać, prawda?

Wielkie dzięki,

Levi

(crosspost z https://discussions.apple.com/message/27946624 )

lewigroker
źródło
@klanomath Thanks. Błąd wklejania kopii. Naprawiłem to w poście.
levigroker
Po skonfigurowaniu przykładu na maszynie wirtualnej polecenie webappctl start org.apache.tomcatpo prostu działa. Może to jakiś problem z buforowaniem. Czy próbowałeś ponownie uruchomić komputer Mac / opróżnić pamięć podręczną? Lub zrestartować serwer WWW?
klanomath
@klanomath Dzięki, jeszcze się nie uruchomiłem ponownie ... Spróbuję. Czy dostałeś „Oto jestem!” post /var/log/system.log? Żeby było jasne, nie ma błędu z webappctl start org.apache.tomcat(wygląda na to, że działa), ale błąd przejawia się w tym system.log, co udokumentowałem.
levigroker
Tak, mam kilka komunikatów „Oto jestem” w pliku system.log. Te z sudo launchctl load org.levi.foo.plist(oczywiście), a także z sudo webappctl start org.apache.tomcat. Po wykonaniu tego ostatniego otrzymujesz również 3-liniową odpowiedź w swojej powłoce, która stwierdza, że ​​org.apache.tomcat jest teraz uruchomiony.
klanomath
Och, dobry żal. @klanomath, wielkie dzięki za drugi zestaw oczu i sugestię, aby ponownie uruchomić. Ponowne uruchomienie komputera i teraz działa zgodnie z oczekiwaniami.
levigroker

Odpowiedzi:

2

Okazuje się, że konfiguracja podana w moim pytaniu jest poprawna i działa zgodnie z oczekiwaniami. Zostało to potwierdzone przez @klanomath, który był w stanie odtworzyć moją konfigurację i zobaczyć, jak wszystko działa zgodnie z oczekiwaniami. Konkretnie:

Po wydaniu:

$ sudo webappctl start org.apache.tomcat

Dostaję oczekiwane „Oto jestem!” wiadomość w /var/log/system.log.

Rozwiązaniem było dla mnie ponowne uruchomienie komputera.

/Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/Wygląda na to , że uruchomione konfiguracje wydają się być w jakiś sposób buforowane, a wprowadzone tam zmiany nie zostaną wykryte, webappctldopóki coś * nie zostanie zrestartowane.

Mam nadzieję, że to uratuje kogoś w dniu, w którym zajęło mi delikatne „próbujesz uruchomić ponownie?” sugestia rozwiązać problem.

Levi

* Nie jestem pewien, co należy zrestartować ... Próbowałem uruchomić i zatrzymać serwer WWW i Server.app, włączając i wyłączając aplikację internetową z poziomu GUI Settings.app, bez żadnego efektu. Jedyną rzeczą, która odebrała zmiany, było pełne ponowne uruchomienie systemu.

lewigroker
źródło