Pytanie
Czy ktoś mógł uruchomić aplikację internetową za pomocą webappctl
konfiguracji, która określa uruchomioną konfigurację w swoim webapp.plist
launchKeys
kluczu?
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.txt
IN /Library/Server/Web/Config/apache2
istnieje 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.plist
która zawiera kilka komentarzy na temat tego, jak ten plist można skonfigurować.
Ustawiać
W moim przypadku dodałem webapp.plist
do /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.plist
który znajduje się /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plist
i 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.sh
któ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ę launchctl
do 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 webappctl
uż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.plist
nie 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:wheel
z 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.plist
in /Library/LaunchDaemons
, a pominięcie launchKeys
z mojego webapp.plist
jako 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 )
źródło
webappctl start org.apache.tomcat
po 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?/var/log/system.log
? Żeby było jasne, nie ma błędu zwebappctl start org.apache.tomcat
(wygląda na to, że działa), ale błąd przejawia się w tymsystem.log
, co udokumentowałem.sudo launchctl load org.levi.foo.plist
(oczywiście), a także zsudo 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.Odpowiedzi:
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:
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,webappctl
dopó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.
źródło