framework haskell snap-framework

framework - ¿Cómo ejecutar la aplicación web haskell Snap en producción?



haskell web framework (3)

Como es Ubuntu, casi siempre es mejor usar advenedizo para administrarlo.

man 5 init

Entre otras cosas, le permite establecer jerarquías de dependencia para sus servicios. "snapapp depende de mongodb, así que no inicie snapapp hasta que mongodb se esté ejecutando", ese tipo de cosas.

Sí, snap es un servidor web, pero casi siempre ponemos nginx delante de ellos con las aplicaciones snap solo escuchando en localhost, y un proxy_path apuntando al servidor o un grupo de ellos.

Es bastante gracioso, casi hemos cambiado a Common Lisp por un nuevo desarrollo en $ work y la configuración es exactamente la misma.

Instalé Snap / Haskell en mi servidor de producción de Ubuntu (en EC2) y verifiqué mi proyecto, pero ¿cómo lo ejecuto?

Es decir, localmente, lo ejecuto desde la línea de comandos:

project-name -p 8000

Snap viene con su propio servidor web ( parece que sí ), y si es así, ¿cómo hago para configurarlo para que funcione como un demonio de algún tipo?

¿Algun consejo?

Edición 2:

En la wiki dicen:

snap-server es una biblioteca de servidor HTTP que admite la interfaz definida en snap-core.

Mientras está aquí, la wiki de haskell sobre "Opciones de implementación / backend para su código web de haskell" dice que Snap:

incluye su propio servidor. ver Web / Frameworks

Pero ¿CÓMO ? ¿Cómo ejecutaría su propio servidor? ¿Por qué debo saber sobre el despliegue de la maldita cosa si solo estoy interesado en la programación ...

Edición: pregunta relacionada: Implementar el código de Haskell que usa Snap Framework


Ok, después de digging y asking , esto es lo que se me ocurrió.

Gran idea

Compila tu aplicación Snap en un archivo binario y luego ejecútalo como un servicio con la ayuda de upstart .

Paso a paso

  1. Compila tu aplicación web. Por el bien de este ejemplo, asumiremos que la aplicación web está en /home/john/webapps/mysite :

    $ cd /home/john/webapps/mysite $ cabal install ... Preprocessing executable ''mysite` for ''mysite-0.1''... Installing executable(s) in /home/john/.cabal/bin

    Como podemos ver, el binario se coloca en /home/john/.cabal/bin . Puede moverlo a cualquier lugar que desee, pero lo dejaremos allí.

  2. Cree un registro en la carpeta de la aplicación; de lo contrario, snap se quejará:

    $ mkdir /home/john/webapps/mysite/log

  3. Ahora crearemos un servicio que ejecutará nuestra aplicación web. Para ello usaremos el servicio de instalación de Ubuntu llamado upstart .

    a) Nombramos nuestro servicio simplemente creando un archivo conf con el nombre deseado en el directorio /etc/init/ . Vamos a llamarlo mysite :

    $ sudo vi /etc/init/mysite.conf

    b) Ahora agreguemos la descripción de nuestro servicio:

    start on startup chdir /home/john/webapps/mysite exec /home/john/.cabal/bin/mysite -p 80

    Primero, decimos que el servicio debería ejecutarse al inicio (o al arrancar) del sistema.

    Segundo, dado que Snap necesita sus snaplets y otros recursos estáticos (como el directorio de registro que creamos anteriormente), le decimos al servicio que se ejecute dentro del directorio de nuestro proyecto.

    Por último, especificamos el binario que realmente se ejecutará como un servicio: /home/john/.cabal/bin/mysite . Pasamos el parámetro -p 80 al snap webserver para que se ejecute en el puerto 80. (Nota: debe desactivar todos los servidores apache y nginx, para que no ocupen ese puerto)

  4. Hecho. Puede verificar si se está ejecutando e iniciarlo manualmente si necesita:

    initctl list | grep mysite initctl start mysite


Sí, snap-server es su propio servidor, lo que significa que la compilación de su aplicación Haskell / Snap lo deja con un ejecutable que puede ejecutar literalmente desde la línea de comandos para alojar su sitio. Eso es todo, no hay un servidor externo como apache o nginx para vincular. Puede configurar proxies inversos si es necesario, pero eso depende de usted.

Esto es lo que hago con la mayoría de mis implementaciones serias:

  • Compila en el mismo linux box o una máquina compatible: casi siempre uso cabal-dev para sandboxing
  • Argumentos de la línea de comando: cabal-dev/bin/myapp -p 8010 -e prod +RTS -A4M -qg1
  • Corro en un puerto no privilegiado, no predeterminado (8010 arriba) para poder usar un equilibrador de carga para reenviar las solicitudes. Esto también me permite ejecutar múltiples aplicaciones de complemento por caja de Linux si es necesario.
  • Luego uso una sencilla aplicación de monitoreo de procesos para asegurarme de que esté funcionando. Puedes usar:
  • Una vez que el monitor esté configurado, puede enviar una señal HUP a su aplicación cada vez que desee reiniciar y la aplicación de monitoreo solo lo volverá a activar.
  • Soy un gran fan de Fabric para la automatización de la implementación. Puede manejar la sincronización remota, reiniciar, etc., todo utilizando la estructura.

Espero que esto ayude.