2012-01-11 25 views
8

He leído todos los subprocesos de implementación Haskell que pude encontrar aquí y varios en la web más amplia, pero aún no entiendo una cosa. Si he compilado una aplicación para mi servidor, y puedo instalarla y ejecutarla, ¿cómo hago para ejecutarla? Supongamos que estoy usando una interfaz HTTP (no FastCGI).Cómo ejecutar una aplicación web Haskell implementada

Por ejemplo, con node.js, usamos clúster para iniciar la aplicación en varios núcleos de procesador, luego creamos un script init.d para centOS para ejecutarlo, daemonize, tener un archivo pid, etc.

¿Cómo hago esto para una aplicación Haskell?

+1

¿Estás utilizando un marco específico? (Happstack/Yesod/etc?) – alternative

+0

Sí. :) Estoy interesado tanto en Happstack como en Snap. He estado jugando con Hack2, pero usa el servidor de Snap. –

Respuesta

6

Dado que no menciona qué marco está utilizando, voy a responder a esta pregunta en general.

Con Haskell, no tiene que iniciar varias instancias (en un clúster) de la aplicación web, ya que si la aplicación admite simultaneidad, generalmente utiliza varios subprocesos internamente. Lo que en su lugar desea hacer es asegurarse de que la aplicación esté compilada con los indicadores -threaded y -rtsopts. Luego, cuando ejecuta la aplicación, pasa las banderas +RTS -N<number of simultaneous threads>. Si utiliza una aplicación web Snap que se ejecute en el puerto 1234 en una computadora de 8 núcleos con Intel® Hyper-Threading, por ejemplo, la iniciará con my-server -p 1234 +RTS -N16 para hacerla paralela a hasta 16 subprocesos del sistema operativo.

Para demonizar la aplicación web, utilice el mismo procedimiento que con node.js. Usted crea un script de inicio que inicia el ejecutable en varios modos de ejecución de UNIX, y Bob es su tío.

Al igual que con cualquier otra aplicación web, es posible que desee utilizar un servidor front-end que redirija el tráfico a su aplicación web (por lo que es posible que no desee usar el puerto 80 para sus aplicaciones web). Para detalles sobre cómo hacer esto, visite the Web/Deploy page on HaskellWiki.

+0

¡Respondió exactamente la pregunta que estaba tratando de resolver! Pero, ¿cómo se ejecuta la aplicación snap en su servidor si no se desea utilizar un servidor front-end (no sé por qué lo necesitaría)? Simplemente como, digamos servicio de Ubuntu, que ejecuta "your_app_name -p 80 + RS -N16" ??? Espero que respondas, he estado tratando de resolver esto por un tiempo ... ¡Gracias! – drozzy

2

Los tres grandes frameworks web Haskell (Snap, Yesod y Happstack) tienen la capacidad de enviarse con un servidor web integrado. El enfoque tradicional de la implementación de producción es probablemente usar el mecanismo de su SO para ejecutar un proceso como un daemon en un script de inicio o similar. Una solución más liviana que he usado es un script como el siguiente:

while true; do 
    echo Restarting at `date` | tee -a stdout.log stderr.log > /dev/null 
    ./my_app 80 >> stdout.log 2>> stderr.log 
done 

Ejecuto este script en segundo plano. Es muy simple, por lo que el proceso de script de shell en sí nunca falla. Si el servidor falla por alguna razón, este script automáticamente asegura que se reinicia inmediatamente. Si desea lanzar una nueva versión, simplemente cópiela sobre el ejecutable my_app y envíe un SIGHUP al proceso my_app.

Los administradores de sistemas endurecidos pueden estremecerse en algo como esto. No diré que esta es la mejor manera de hacerlo, pero he estado ejecutando una aplicación de producción durante varios años con este enfoque y ha funcionado muy bien. Como otros han mencionado, también puede configurarlo con un servidor proxy front-end para que su aplicación no tenga que ejecutarse como root.

+0

Este enfoque hace que sea difícil hacer cosas que muchos administradores de sistemas quieren hacer con sus daemons, como verificar el estado del proceso (que no se puede hacer con 'ps aux | grep ...'o' pgrep' cuando tienes múltiples daemons con el mismo/nombres similares), realiza recargas de configuración reales sin señales especiales, etc. – dflemstr

+0

Por supuesto. Es una solución más liviana que me ha funcionado bien en situaciones en las que el enfoque que podría tomar un administrador de una carrera parecía un poco pesado. – mightybyte

Cuestiones relacionadas