Configure la aplicación web del servidor Yosemite con LaunchD

4

Pregunta

¿Alguien ha podido iniciar con éxito una aplicación web a través de una webappctlconfiguración que especifica una configuración de lanzamiento en su webapp.plist launchKeysclave?

Antecedentes

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 configuración de un sitio web.

Si se echa un vistazo en la ReadMe.txten /Library/Server/Web/Config/apache2que hay una sección que establece:

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 entradas man, como se sugiere en ReadMe.txt mediante estos comandos 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 configuración de muestra de aplicación web /Library/Server/Web/Config/apache2/com.example.mywebapp.plistque tiene algunos comentarios sobre cómo se podría configurar este plist.

Preparar

En mi caso, he agregado una webapp.plistal /Library/Server/Web/Config/apache2/directorio 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>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>

Prestando atención específica a:

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

que especifica mi launchd.plistque se encuentra en /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/org.levi.foo.plisty 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.shque 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 launchctlpara cargar manualmente el org.levi.foo.plist:

$ sudo launchctl load org.levi.foo.plist

Recibo el mensaje 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 webappctlpara iniciar la configuración de mi aplicación web (arriba):

$ sudo webappctl start org.apache.tomcat

Me sale 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!" mensaje.

Esto parece indicar que mi launchd.plistno está llegando tan lejos como para ejecutar el script cuando intento iniciar webappctl, pero no tengo idea de qué operación no se pudo completar, o por qué no. Todos los archivos que he mencionado son propiedad root:wheelcon rw-r--r--permisos, excepto el script, que es rwx-r-xr-x.

Entonces, ¿qué magia se debe realizar para que mi aplicación web cargue / descargue mi configuración de launchd al iniciar / detener?

Nota al margen: Obviamente, estas configuraciones y scripts son ejemplos simples que he usado para propósitos de depuración y para simplificar los detalles aquí. En realidad, estoy tratando de defender una instancia de Tomcat como una "aplicación web" para que se ejecute detrás de Apache 2 en mi servidor de modo que pueda implementar aplicaciones web verdaderas a través de Tomcat y que se publiquen en la web).

Nota al pie 2: sé que puedo instalar mi launchd.plisten /Library/LaunchDaemons, y evitar el uso launchKeysde mi webapp.plistcomo una solución, pero esto no me permite para iniciar / detener la aplicación web a través de Server.app (o la línea de comandos equivalente), y, quiero decir, se debe trabajar, ¿verdad?

Muchas gracias,

Levi

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

levigroker
fuente
@klanomath Gracias. Un error de copiar y pegar. Lo arreglé en la publicación.
levigroker
Después de configurar su ejemplo en una VM, el comando webappctl start org.apache.tomcatsimplemente funciona. Tal vez sea un problema de almacenamiento en caché. ¿Intentaste reiniciar tu Mac / vaciar las cachés? ¿O reiniciar el servidor web?
klanomath
@klanomath Gracias, aún no he reiniciado ... lo intentaré. ¿Recibiste el "Aquí estoy!" mensaje en /var/log/system.log? Para ser claros, no hay ningún error de webappctl start org.apache.tomcat(parece que funciona), pero el error se manifiesta en el system.logque he documentado.
levigroker
Sí, recibí varios mensajes "Aquí estoy" en system.log. Los de sudo launchctl load org.levi.foo.plist(por supuesto) y también de sudo webappctl start org.apache.tomcat. Después de ejecutar este último, también obtiene una respuesta de 3 líneas en su shell que indica que org.apache.tomcat está EN EJECUCIÓN ahora.
klanomath
Oh Dios mío. @klanomath, muchas gracias por su segundo par de ojos y sugerencia para reiniciar. Un reinicio de la máquina y ahora funciona como esperaba.
levigroker

Respuestas:

2

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

Después de emitir:

$ sudo webappctl start org.apache.tomcat

Me sale el esperado "¡Aquí estoy!" mensaje en /var/log/system.log.

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

Al parecer, tenga en cuenta que las configuraciones de launchd /Applications/Server.app/Contents/ServerRoot/System/Library/LaunchDaemons/parecen estar en caché de alguna manera, y los cambios realizados allí no se recogen hasta que webappctlse reinicia algo *.

Espero que esto salve a alguien el día que me llevó tener un suave "¿has intentado reiniciar?" sugerencia resolver el problema.

Levi

* No estoy seguro de qué debe reiniciarse ... Intenté iniciar y detener el servidor web y Server.app, habilitando e inhabilitando la aplicación web desde la GUI de Settings.app, sin ningún efecto. Lo único que detectó los cambios fue un reinicio completo del sistema.

levigroker
fuente