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.

  • ¿Hay alguna forma de ver las concesiones estáticas conectadas en Lion Server?
  • Agregue opciones personalizadas a la configuration de Apache Vhost
  • (Custom Build) Super Time Capsule - me estoy perdiendo algo
  • Administrador de perfiles pendiente en algunos dispositivos
  • ¿Por qué ciertos packages fallan en NetInstall?
  • automountd: No hay tal error de file o directory (assembly NFS en iMac desde Mac Mini)
  • Servidor Snow Leopard en Parallels con Retina MacBook Pro (sin unidad de DVD)
  • Cómo arreglar system.log llenando con servermgrd "Registro del tipo dsRecTypeStandard: Config named 'ServicesInformation101004'?
  • ¿Cómo implementar Mac OS X 10.6.8 en varios clientes?
  • Restricciones modernas del server de MacOS
  • ¿Cómo funciona el codesign y la firma de perfiles en os x?
  • Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).