Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Porter son application python sur nginx

+6 votes

Je voudrais savoir comment je peux porter une application personnelle dev en python sur un serveur web nginx, a la manière d'apache2. J'ai trouvé quelques tutos, mais ils étaient pour django, ou pour des applications précises. J'ai installé uWSGI, mais je ne sais pas le configurer pour mon application, que dois-je faire ?

Ma config:
Debian 7.6, nginx 1.6.2, uWSGI 2.0.9, python 2.7.3 et 3.2.3 d'installé (Je ne sais pas d'ailleurs lequel utiliser)

demandé 22-Jan-2015 par fayak (292 points)

J'imagine que tu as lu ce tutoriel? Sinon, le quickstart de uwsgi est pas mal aussi. Et si tu nous en disais un peu plus sur ton application? Comment tu l'as codée, organisée?

Je rajoute au commentaire de Nsukami_ ce lien vers la doc de déploiement de Flask sur Nginx avec uWSGI.

@Nsukami_ Oui effectivement j'ai lu ce tutoriel, la doc de uwsgi et bien d'autres articles sur le web, mais comme il est dit dans le tuto, c'est très mal expliquer je trouve, et surtout les explications que je trouve diffère d'un site à l'autre. Par exemple dans la doc d'uwsgi il te dise de passer par un adresse ip locale comme socket, et sur d'autres sites par un fichier, du coup de m'y perds un peu. L'application en soit n'a rien de fou, je cherche en premier lieu à faire fonctionner le serveur avec un hello world. Je rajouterais de plus que les tutos sont pour des frameworks style django, et j'aimerais ne pas les utiliser, mais faire de a à z
Ci-joint mes fichier de config :

config nginx (j'ai raccourci pour avoir l'essentiel)

server {
listen 8092;
server_name example.com;

error_log /home/fayak/log/nginx_error.log;
access_log /home/fayak/log/nginx_access.log;

location / {
    include uwsgi_params;
    uwsgi_pass unix:/var/run/uwsgi/app/test/socket;
    }
}

Mon fichier test.ini dans /Etc/uwsgi/apps-enabled

[uwsgi]
plugins = /home/fayak/python/www/
chdir = /home/fayak/python/www/
module = test.app
callable = application

Mon dossier /home/fayak/python/www/ est en chmod 777 et chown www-data (config nginx) et contient wsgi.py avec le code du hello world dedans.

J'en suis arrivé la, après quelques heures de bataille, et lors d'un servce uwsgi restart il plante, dans les logs j'obtient ca :

Thu Jan 22 20:58:01 2015 - writing pidfile to /run/uwsgi/app/test/pid
Thu Jan 22 20:58:01 2015 - detected binary path: /usr/local/bin/uwsgi
Thu Jan 22 20:58:01 2015 - setgid() to 33
Thu Jan 22 20:58:01 2015 - setuid() to 33
Thu Jan 22 20:58:01 2015 - chdir() to /home/fayak/python/www/
Thu Jan 22 20:58:01 2015 - chdir(): Permission denied [core/uwsgi.c line 2554]

Merci en tout cas de ton aide

@fayak Pour faire de A a Z comme tu dit, et avec n'importe quel fichier py, il suffit d'avoir a l'interieur, une variable application, c'est cette variable qui sera le point d'entree de ton application.

En ce qui concerne les sockets, les deux options restent valides, unix socket: unix:///tmp/uwsgi.sock ou tcp socket: 127.0.0.1:3031 Je te laisse chercher la difference entre les deux.

La derniere ligne de tes logs me dit que tu as juste un probleme de droits sur le repertoire /home/fayak/python/www/

J'ai egalement l'impression que le ini de ton uwsgi est incomplet, je ne vois aucune reference au socket, ni au droit que tu donnes sur ce socket.

@Nsukami_
Mon code contient:

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["Hello!"]

Ce qui me semble être correct, par contre en effet mon fichier .ini est sans doute incomplet, je vais chercher dans la doc les instructions à rajouter. Mais sinon pour les droits, ça me semble bizarre vu qu'il a le chmod 777. Je vais essayer, je te tiens au courant, mais je pense qu'il faudrait que je résolve le pb dans les logs, d'autant plus que dans les logs de uwsgi, il crash avant de faire appel au socket

2 Réponses

+7 votes
 
Meilleure réponse

Bon après ces conseils éclairés plus des sujets sur stackoverflow et des heures de config infructueuse, j'ai enfin réussi à faire fonctionner le tout. Pour ceux qui sont intéressés :

$ apt-get install build-essential python python-dev nginx uwsgi uwsgi-plugin-python 

Pour la config de nginx, je vous laisse la trouver, il y a plein de sites, mais voici celles du serveur virtuel /etc/nginx/sites-enabled/fayak (remplacer fayak par ce que vous voulez, c'est mon pseudo):

server {
listen 8000; #Port d'écoute, mettez ce que vous voulez, j'ai pas mis le port 80 (par défaut) car il était utilisé par apache2
server_name coon.fr; #L'url de votre serveur

error_log /home/fayak/log/nginx_error.log; #Logs perso, vous pouvez changer
access_log /home/fayak/log/nginx_access.log;

location / {
    include uwsgi_params;
    uwsgi_pass unix:/var/run/uwsgi/app/test/socket;  #Le socket de dialogue entre nginx et uwsgi, remplacer test par le nom de votre choix, celui du fichier .ini de config de uwsgi
    }
}

Mon fichier /etc/uwsgi/apps-enabled/test.ini :

[uwsgi]
plugins = /home/fayak/python/www/ #Le chemin vers votre application python
chdir = /home/fayak/python/www/
wsgi-file = /home/fayak/python/www/app.py #L'app en question
#module = mysite.wsgi
callable = application

Mon fichier app.py contient le hello world qu'on peut trouver sur les pages de wiki de uwsgi par exemple. A noter que mon dossier est en chown www-data et chmod 777
Et pour lancer le tout,

$ service nginx restart
$ service uwsgi restart

Voila, pour ceux que ça pourrait aider, bonne chance !

répondu 23-Jan-2015 par fayak (292 points)
sélectionné 24-Jan-2015 par fayak

Si c'est la ta solution tu peux valider ta réponse. Ça servira aux suivants qui tomberont sur le sujet.

0 votes

Tous les dossiers du chemin /home/fayak/python/www/ doivent être traversables par nginx. Donc :

chmod  o+x /home/fayak 
chmod  o+x /home/fayak/pyhton
chmod  o+x /home/fayak/pyhton/www 
répondu 22-Jan-2015 par Sam (5,000 points)

Oui c'est fait, j'ai trouvé d'ailleurs pourquoi j'avais le permissions denied, c'est qu'il y avait un .ini par defaut avec le même nom de config (le nom entre crochets au début), j'ai donc renommé, et je n'ai plus eu ce problème, mais ce n'est pas la fin des galères car maintenant j'ai un "Internal Server Error", et

--- no python application found, check your startup logs for errors ---

dans les logs uwsgi. J'ai donc cherché sur des forums, qui me disait de définir wsgi-file dans le fichier de config, ce qui est fait, mon fichier .py contient d'ailleurs bien une variable application, j'avais mis le code sur un autre commentaire. Enfin bref, c'est à s'y prendre la tête, je m'arrête la pour ce soir. J'ai bien avancé vu que je suis passé d'une erreur a une autre \0/

...