29 votes

Comment exécuter Snap haskell webapp en production?

J'ai installé le composant logiciel Enfichable/Haskell sur mon serveur Ubuntu (sur EC2), et extrait de mon projet - mais comment puis-je le faire fonctionner?

Je veux dire, localement, je le lance en ligne de commande:

project-name -p 8000

Ne snap venir avec son propre serveur web (il ressemble à ça), et si oui, comment dois-je aller sur la configuration qu'il fonctionne comme un démon de la sorte?

Des conseils à donner?

Edit 2:

Sur le wiki , ils disent:

snap-serveur est un serveur HTTP bibliothèque qui prend en charge l'interface défini dans le composant logiciel enfichable de base.

Alors qu'ici, le haskell wiki à propos de "Déploiement/Backend options pour votre haskell code web" dit que le Magnétisme:

inclut son propre serveur. voir Web/Cadres

Mais COMMENT? Comment aurais-je exécuter son propre serveur? Pourquoi dois-je savoir sur le déploiement de la fichue chose si je suis juste intéressé par la programmation...

Edit: question liée à: Déployer du code Haskell qui utilise le composant logiciel Enfichable Cadre

25voto

drozzy Points 7887

Ok, après un peu de creuser et de demander, voici ce que je suis venu avec.

Grande idée

Compiler vos composants de l'application dans un fichier binaire, puis exécuter en tant que service avec l'aide de l' arriviste.

Étape par étape

  1. Compiler votre webapp. Pour les besoins de cet exemple, nous supposerons que la webapp est à l' /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
    

    Comme nous pouvons le voir, le binaire est placé dans /home/john/.cabal/bin. Vous pouvez le déplacer n'importe où vous le souhaitez, mais nous allons en rester là.

  2. Créer un journal dans le dossier de votre application, autrement composant logiciel enfichable va se plaindre:

    $ mkdir /home/john/webapps/mysite/log
    
  3. Maintenant, nous allons créer un service qui va exécuter notre application. Pour ce faire, nous allons utiliser Ubuntu installation de service appelé arriviste.

    a) Nous le nom de notre service à la simple création d'un fichier conf avec le nom désiré dans l' /etc/init/ répertoire. Appelons - mysite:

    $ sudo vi /etc/init/mysite.conf
    

    b) Maintenant, nous allons ajouter la description de ce que notre service est:

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

    Tout d'abord, nous dire que le service doit s'exécuter au démarrage (ou au démarrage du système.

    Deuxièmement, étant donné que composant logiciel enfichable besoins snaplets et d'autres ressources statiques (comme le répertoire des journaux que nous avons créé précédemment) - nous dire le service à exécuter au sein de notre répertoire du projet.

    Enfin, nous précisons le binaire qui sera effectivement exécuté en tant que service: /home/john/.cabal/bin/mysite. Nous passons à l' -p 80 paramètre pour le composant logiciel enfichable serveur web pour qu'il fonctionne sur le port 80. (Remarque: vous devez désactiver tous les apache et nginx serveurs, de sorte qu'ils ne prennent pas le port en plus)

  4. Fait. Vous pouvez vérifier si elle est en cours d'exécution et le démarrer manuellement en cas de besoin à:

    initctl list | grep mysite
    initctl start mysite
    

17voto

ozataman Points 562

Oui, snap-serveur est de son propre serveur, ce qui signifie que la compilation de votre Haskell/Snap app vous laisse avec un exécutable que vous pouvez littéralement courir à partir de la ligne de commande pour héberger votre site. C'est ça, il n'y a aucun serveur externe comme apache ou nginx pour relier. Vous pouvez configurer les serveurs proxy inverses, si nécessaire, mais c'est à vous.

Voici ce que je fais avec la plupart de mes graves de déploiements:

  • Compiler sur la même machine ou une machine compatible - j'ai presque toujours l'utilisation de la cabale-dev pour le bac à sable
  • Arguments de ligne de commande: cabal-dev/bin/myapp -p 8010 -e prod +RTS -A4M -qg1
  • Je exécutent sur un non-privilégié, non-port par défaut (8010 ci-dessus) afin que je puisse utiliser un équilibreur de charge de transmettre la demande à elle. Cela me permet aussi d'exécuter plusieurs ancrer des applications pour linux, si nécessaire.
  • Puis-je utiliser un simple processus de surveillance de l'application pour s'assurer qu'il reste en place. Vous pouvez utiliser:
  • On le moniteur est mis en place, vous pouvez simplement envoyer un HUP signal à votre demande chaque fois que vous voulez redémarrer et la surveillance de l'application va juste faire remettre en place.
  • Je suis un grand fan de Tissu pour l'automatisation du déploiement. Vous pouvez gérer à distance de la synchronisation, redémarrer, etc. tout en utilisant du tissu.

Espérons que cette aide.

5voto

clintm Points 897

Depuis c'est Ubuntu, vous êtes presque toujours préférable d'utiliser parvenu à le gérer.

man 5 init

Entre autres choses, il vous permet de définir la dépendance des hiérarchies de vos services. "snapapp dépend de mongodb il ne faut pas commencer snapapp jusqu'à ce que mongodb est en cours d'exécution" - ce genre de chose.

Oui, snap est un serveur web, mais nous avons presque toujours mis nginx en face d'eux avec le composant logiciel enfichable applications uniquement à l'écoute sur localhost, et un proxy_path pointant vers le serveur ou un groupe d'entre eux.

Assez drôle, nous avons presque complètement basculé en Common Lisp pour nouveau développement de dollars, du travail et de la configuration est exactement la même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X