nginx + uwsgi + pyramid

Introduction

Le site easytan a été développé en utilisant le framework Pyramid. Au cours du développement, on peut utiliser le serveur intégré (paster ou waitress selon les version) pour tester le fonctionnnement. En production, il vaut mieux utiliser une solution plus performante comme le serveur http nginx. Toutefois ce dernier ne supporte pas les applications wsgi (Apache dispose du module mod-wsgi). C’est là qu’intervient uwsgi qui permet de faire le lien entre l’application wsgi et le serveur nginx.

Installation sous Debian Wheezy

On fait l’hypothèse qu’on a installé le site Pyramid dans un virtualenv Python /home/http/ve_prod. Pour plus de détails, voir la documentation Pyramid. Le site est situé classiquement dans le répertoire /home/http/ve_prod/easytan. C’est également dans ce répertoire qu’on trouve les fichiers development.ini et production.ini.

On commence par installer les paquets pour nginx et uwsgi.

aptitude install nginx-full uwsgi uwsgi-plugin-python

Configuration uwsgi

Le package Debian contient une configuration par défaut assez complète. Du coup, il y a peu de choses à ajouter dans le fichier de config /etc/uwsgi/apps-available/easytan.ini:

[uwsgi]
virtualenv = /home/http/ve_prod
ini-paste = /home/http/ve_prod/easytan/production.ini

La première ligne pointe vers le virtualenv tandis que la seconde ligne pointe vers le fichier de configuration souhaité, a priori production.ini pour le serveur de production.

Configuration nginx

La configuration par défaut de uwsgi sous Debian crée un socket à l’emplacement /run/uwsgi/app/easytan/socket. Le nom du socket est crée en fonction du nom du fichier de configuration uwsgi.

Ici, on va créer un hôte virtuel easytan avec nginx. On crée un fichier /etc/nginx/sites-available/easytan.conf et on fera un lien symbolique dans /etc/nginx/sites-sites-enabled pour activer le serveur.

Contenu du fichier /etc/nginx/sites-available/easytan.conf:

server {
    listen [::]:80;
    server_name  easytan.chataignon.com;

    access_log      /var/log/nginx/easytan.access.log;
    error_log       /var/log/nginx/easytan.error.log;

    charset         utf-8;

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

    location /static {
        root                    /home/http/ve_prod/easytan/easytan;
        expires                 1d;
        add_header              Cache-Control public;
        access_log              off;
    }
}

C’est tout.