Configurar la aplicación web de server de Yosemite con LaunchD

Pregunta

¿Alguien ha podido iniciar con éxito una aplicación web a través de una configuration webappctl que especifica una configuration de webapp.plist en su key webapp.plist launchKeys ?

Fondo

Específicamente, con Server.app instalado, uno puede, en teoría, configurar aplicaciones web personalizadas que aparecerían en la GUI de Server.app en la "Configuración avanzada" de la configuration de un website.

Si echa un vistazo al ReadMe.txt en /Library/Server/Web/Config/apache2 hay una sección que dice:

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

También puede leer las inputs man, como se sugiere en el file ReadMe.txt mediante estos commands de terminal:

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

También hay una configuration de ejemplo de aplicación de webapp /Library/Server/Web/Config/apache2/com.example.mywebapp.plist que contiene algunos comentarios sobre cómo se puede configurar este plist.

Preparar

En mi caso, he agregado una webapp.plist al webapp.plist /Library/Server/Web/Config/apache2/ que se ve así:

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

Prestando atención específica a:

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

que especifica mi launchd.plist que se encuentra en /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plist y se ve así:

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

que simplemente debería llamar al script /Library/Tomcat/start.sh que es simplemente:

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

Problema

Si uso launchctl para cargar manualmente org.levi.foo.plist :

 $ sudo launchctl load org.levi.foo.plist 

Obtengo el post esperado en /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! 

Sin embargo, si uso webappctl para iniciar la configuration de mi aplicación web (arriba):

 $ sudo webappctl start org.apache.tomcat 

/var/log/system.log un error en /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 

y no veo mi "¡Aquí estoy!" post.

Esto parece indicar que mi launchd.plist no está llegando a ejecutar el script cuando bash iniciarlo a través de webappctl , pero no tengo idea de qué operación no pudo completarse o por qué no. Todos los files que he mencionado son propiedad de root:wheel con rw-r--r-- permissions, a exception de la secuencia de commands, que es rwx-r-xr-x .

Entonces, ¿qué magia se debe realizar para que mi aplicación web cargue / descargue mi configuration de launchd al inicio / parada?

Nota al margen: Obviamente, estas configuraciones y scripts son ejemplos simples que he utilizado para la debugging y para simplificar los detalles aquí. En realidad, bash poner de pie una instancia de Tomcat como una "aplicación web" para ejecutar detrás de Apache 2 en mi server, de modo que pueda implementar verdaderas aplicaciones web a través de Tomcat y hacer que se publiquen en la Web.

Nota al launchd.plist 2: Sé que puedo instalar mi launchd.plist en /Library/LaunchDaemons , y omitir las launchKeys de mi webapp.plist como una solución alternativa, pero esto no me permite iniciar / detener la aplicación web a través de Server.app (o la línea de command equivalente), y, quiero decir, debería funcionar, ¿verdad?

Muchas gracias,

Levi

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

One Solution collect form web for “Configurar la aplicación web de server de Yosemite con LaunchD”

Resulta que la configuration que planteé en mi pregunta es correcta y funciona como se esperaba. Esto fue confirmado por @klanomath, quien pudo reproducir mi configuration y ver las cosas funcionando como se esperaba. Específicamente:

Después de emitir:

 $ sudo webappctl start org.apache.tomcat 

Obtengo el esperado "¡Aquí estoy!" post en /var/log/system.log .

La solución para mí fue simplemente reiniciar mi máquina.

Tome nota, aparentemente, que las configuraciones de launchd en /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/ parecen estar en caching de alguna manera, y los cambios realizados allí no son recogidos por webappctl hasta que algo * se reinicie.

Espero que esto le salve a alguien el día que me llevó a tener una gentil "¿Has intentado reiniciar?" sugerencia resolver el problema.

Levi

* No estoy seguro de qué se debe reiniciar … Intenté iniciar y detener el server web y Server.app, habilitando y deshabilitando la aplicación web desde Settings.app GUI, sin ningún efecto. Lo único que recogió los cambios fue un reinicio completo del sistema.

  • ¿Cómo conservar la configuration del server DHCP al migrar de Lion Server a Mountain Lion Server?
  • ¿Debo instalar Mac OS X Snow Leopard Server?
  • OS X Server 10.6 y nombres de dominio completamente calificados
  • Cómo prevenir el acceso a internet a clientes específicos
  • Cortando una Mac suelta del directory de inicio portátil
  • ¿Por qué ciertos packages fallan en NetInstall?
  • Mac Mini Server ... ¿Puedo limpiarlo y usar una edición que no sea de server?
  • Comando CLI o script para download desde el server VMware Fusion
  • Configuración de OS X 10.7 Lion Server para servir aplicaciones de Rails a través de Apache
  • OSX server 10.6 y umask
  • Reenvío de puertos para AirPlay en OS X Server
  • ¿Cómo configurar macOS Server para evitar la transferencia de zona DNS?
  • Apple Directory / Profile Manager - ¿Restringir simultáneamente los mismos inicios de session de usuario en varias máquinas?
  • Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).