42 votes

Comment déployez-vous votre application WSGI? (et pourquoi c'est le meilleur moyen)

Le déploiement d'une application WSGI. Il existe de nombreuses façons de la peau, ce chat. Je suis actuellement en utilisant apache2 avec mod_wsgi, mais je peux voir certains problèmes potentiels avec cette.

Alors, comment peut-il être fait?

  1. Apache Mod-wsgi (les autres mod_wsgi semblent ne pas être en vaut la peine)
  2. Pur Python serveur web par exemple coller, cherrypy, le Frai, Tordu.web
  3. comme 2, mais avec des proxy inverse de nginx, apache 2, etc, avec une bonne gestion des fichiers statiques
  4. La Conversion à d'autres protocole, tel que FCGI avec un pont (par exemple Flup) et en cours d'exécution dans une classique de du serveur web.

Plus?

Je veux savoir comment vous faites, et pourquoi c'est la meilleure façon de le faire. Je voudrais absolument amour vous à m'ennuyer avec des détails sur le quoi et le pourquoi, l'application spécifique des choses, etc. Je vais upvote non-fou réponse.

26voto

MrTopf Points 2708

Comme toujours: Il dépend ;-)

Quand je n'ai pas besoin d'apache fonctionnalités que je vais avec un pur python serveur web comme coller etc ... Dont on dépend exactement à votre demande, je suppose et peut être décidé en faisant quelques points de repère. J'ai toujours voulu faire partie, mais n'est jamais venu. Je suppose que la Ponte peut avoir certains avantages dans l'utilisation de non blocage IO hors de la boîte, mais j'ai parfois des problèmes avec elle en raison de l'application de correctifs.

Vous êtes toujours libre de mettre un vernis à l'avant ainsi bien sûr.

Si Apache est nécessaire, je suis souvent aller avec la solution 3, de sorte que je peux garder des processus distincts. Vous pouvez également déplacer plus facilement les processus à d'autres serveurs. Simplement, je tiens à garder les choses séparées.

Pour les fichiers statiques, je suis en utilisant un serveur distinct pour un projet qui sert juste statique images/css/js. J'utilise lighttpd en tant que serveur web qui a un grand rendement (dans ce cas je n'ai pas de vernis devant plus).

Un autre outil utile est supervisord pour le contrôle et la surveillance de ces services.

Je suis en outre à l'aide de buildout pour la gestion de mon déploiement et le développement des bacs à sable (avec virtualenv).

13voto

Jason Baker Points 56682

Absolue de la chose la plus facile à déployer est CherryPy. Votre application web peut également devenir un serveur web autonome. CherryPy est également assez rapide au serveur considérant qu'il est écrit en pur Python. Cela dit, ce n'est pas Apache. Donc, je trouve que CherryPy est un bon choix pour baisser le volume webapps.

Autre que cela, je ne pense pas qu'il soit de bonne ou de mauvaise réponse à cette question. Beaucoup de volume élevé de sites web ont été construites sur les technologies de vous parler, et je ne pense pas que vous pouvez aller trop de mal à aucun de ces moyens (même si je dis que je suis d'accord avec mod_wsgi de ne pas être à la hauteur sur tous les non-serveur apache).

Aussi, j'ai été en utilisant isapi_wsgi à déployer des applis python sous IIS. C'est un de moins que l'idéal de l'installation, mais il fonctionne et vous n'avez pas toujours la possibilité de choisir autrement quand vous vivez dans un windows centrée sur le monde.

13voto

bobince Points 270740

Je voudrais absolument vous à m'ennuyer avec des détails sur le quoi et le pourquoi, spécifiques à l'application des trucs, etc

Ho. Eh bien vous l'avez demandé!

Comme Daniel personnellement, j'utilise Apache avec mod_wsgi. Il est encore assez nouveau que de le déployer dans certains environnements, peut être un combat, mais si vous compilez vous-même tout de toute façon, c'est assez facile. Je l'ai trouvé très fiable, de même que les premières versions. Accessoires pour Graham Dumpleton pour garder le contrôle d'elle assez bien par lui-même.

Cependant pour moi, il est essentiel que WSGI applications fonctionnent sur tous les serveurs possibles. Il y a un peu d'un trou à l'heure actuelle dans ce domaine: vous avez le standard WSGI vous dire ce qu'est un WSGI remboursables (application), mais il n'y a pas de normalisation de déploiement; pas une seule façon de dire au serveur web où trouver l'application. Il ya aussi pas de manière standardisée pour que le serveur de rechargement de l'application lorsque vous avez mis à jour.

L'approche que j'ai adoptée est de mettre:

  • toute la logique de l'application en modules/packages, de préférence dans les classes

  • tous site-spécifique personnalisations à être fait par dérivation de l'Application principale et dominante membres

  • tous les spécifiques au serveur les paramètres de déploiement (par exemple. la connexion à la base de l'usine, de relais de messagerie paramètres) dans la classe __init__() paramètres

  • un haut-niveau "application.py" le script qui initialise la classe d'Application avec le déploiement correct des paramètres pour le serveur actuel, puis exécute l'application d'une telle manière qu'il puisse travailler déployé comme un script CGI, un mod_wsgi WSGIScriptAlias (ou le Passager, qui apparemment fonctionne de la même manière), ou peut être en interaction avec la ligne de commande

  • un module d'aide qui prend soin de ci-dessus les problèmes de déploiement et permet à l'application d'être rechargé lorsque les modules de l'application repose sur le changement

Donc, ce que l'application.py ressemble à la fin est quelque chose comme:

#!/usr/bin/env python

import os.path
basedir= os.path.dirname(__file__)

import MySQLdb
def dbfactory():
    return MySQLdb.connect(db= 'myappdb', unix_socket= '/var/mysql/socket', user= 'u', passwd= 'p')

def appfactory():
    import myapplication
    return myapplication.Application(basedir, dbfactory, debug= False)

import wsgiwrap
ismain= __name__=='__main__'
libdir= os.path.join(basedir, 'system', 'lib')
application= wsgiwrap.Wrapper(appfactory, libdir, 10, ismain)

Le wsgiwrap.Wrapper vérifie toutes les 10 secondes pour voir si l'un des modules de l'application dans libdir ont été mis à jour, et si oui fait un peu méchant sys.les modules de la magie pour décharger en toute sécurité. Puis appfactory() sera appelée de nouveau pour obtenir une nouvelle instance de l'application mise à jour.

(Vous pouvez également utiliser les outils de ligne de commande tels que

./application.py setup
./application.py daemon

pour exécuter un programme d'installation et d'arrière-plan-tâches crochets fournis par l'application appelable - un peu comme la façon dont distutils œuvres. Il répond également à démarrer/arrêter/redémarrer comme un script init.)

Une autre astuce que j'utilise est de mettre les paramètres de déploiement de plusieurs serveurs (développement/test/production) dans le même application.py script, et de renifler de la prise.gethostname()' pour décider laquelle spécifiques au serveur tas de paramètres à utiliser.

À un certain point, j'ai peut-paquet wsgiwrap et de libérer correctement (peut-être sous un autre nom). En attendant, si vous êtes intéressé, vous pouvez voir une dogfood-version de développement au http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py.

6voto

Vasil Points 11172

Nginx reverse proxy et statique de partage de fichiers + XSendfile + uploadprogress_module. Rien ne vaut pour le but.

Sur le WSGI côté soit Apache + mod_wsgi ou cherrypy serveur. J'aime utiliser cherrypy wsgi serveur pour les applications sur des serveurs avec moins de mémoire et moins de demandes.

Raisonnement:

J'ai fait des repères avec des outils différents pour les différentes solutions populaires.

J'ai plus d'expérience de niveau inférieur TCP/IP que le développement web, en particulier http implémentations. Je suis plus confiant que je peux reconnaître un bon serveur http que je peux reconnaître un bon framework web.

Je sais Tordu beaucoup plus que Django ou des Pylônes. La pile http Tordus n'est pas encore à cela, mais il sera là.

4voto

Baltimark Points 2600

J'utilise Google App Engine pour une application que je développe. Il exécute des applications WSGI. Voici quelques informations à ce sujet.

C'est la première application web sur laquelle j'ai vraiment travaillé, donc je n'ai pas de base de comparaison, mais si vous êtes un fan de Google, vous voudrez peut-être y jeter un coup d'œil. Je me suis beaucoup amusé à l'utiliser comme cadre d'apprentissage.

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