Hachther Blog > Développement Web  > Déployer un projet Django avec nginx et uWSGI
Django avec nginx et uWSGI

Déployer un projet Django avec nginx et uWSGI

Je suis fan de python, je le trouve cool, simple, élégant. Quand j’ai voulu démarrer mon premier projet, j’ai cherché s’il existait un framework pour le développement web avec Python. C’est comme ça que j’ai trouvé Django et je l’ai utilisé pour mon premier projet (Hachther Frence): je l’ai trouvé génial. Mais l’un de mes défis était de déployer mon projet en production, c’est pourquoi je décide d’écrire cet article: “Déployer le projet Django avec nginx et uWSGI” pour partager mon expérience.

Tous les développeurs Django connaissent cette commande: ./manager.py runserver 0.0.0.0:8000 qui est utilisé pour démarrer le serveur en mode développement. Mon premier réflexe était de démarrer cette commande en arrière-plan et de configurer nginx pour s’y connecter: GROSSE ERREUR. J’ai rapidement commencé à avoir des problèmes de performance et quand j’ai découvert que ce n’était pas la façon de déployer un projet en mode production.

Dans la prochaine, je vais vous montrer comment j’ai réussi à déployer mon projet sur Ubuntu 16.04. Ainsi, toutes les commandes utilisées seront des commandes Ubuntu.

Avant de déployer votre projet

Avant le déploiement, il existe un ensemble d’éléments que vous devez vérifier du point de vue de la sécurité ou de l’optimisation. Pour ce faire, vous pouvez taper cette commande manager.py check --deploy pour vérifier les paramètres ci-dessous.

SECRET_KEY

Ceci est utilisé pour la sécurité des données cryptées sur le projet. Cette valeur doit être longue, aléatoire et secrète. Donc, pour la garder secrète, vous ne devez pas le partager dans votre dépôt: vous pouvez le stocker dans une variable d’environnement

os.environ['SECRET_KEY']

ou bien la conserver dans un fichier:

with open('/etc/secret_key.txt') as f:
    SECRET_KEY = f.read().strip()

DEBUG et ALLOWED_HOSTS

Vous devez définir la variable DEBUG à DEBUG = False dans le fichier de configuration. Cela mettra votre projet en mode production.

Lorsque vous définissez DEBUG à False, vous devez définir ALLOWED_HOSTS avec la liste des hôtes autorisés à accéder à votre projet. Exemple: ALLOWED_HOSTS = (exemple1.domaine.com, exemple2.domaine.com, ...)

Autres paramètres

Pour l’optimisation de votre application, vous devez penser à des éléments tels que: cache, base de données, journalisation, etc. Allez sur ce lien pour plus de détails: https://docs.djangoproject.com/fr/1.11/howto/deployment/checklist/.

Maintenant que tout est OK du côté de Django, continuons avec uWSGI.

uWSGI

uWSGI est un contenu de serveur rapide et dynamique. Il reste entre le serveur web (nginx dans notre cas) et vous l’application Django. uWSGI est une implémentation du protocole WSGI (Web Server Gateway Interface) qui utilise les sockets unix pour répondre à la demande du client.

Installation

L’installation est assez simple. Vous pouvez utiliser pip le gestionnaire de paquets de python et installer la version dans le depot ou vous pouvez l’installer à partir d’un lien.

# Installer la version actuelle stable
$ pip install uwsgi

# Ou installer la version LTS (long term support).
$ pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

Configuration et démarrage de uWSGI

La configuration et le démarrage peuvent être effectués de deux manières: en passant les paramètres en ligne de commande ou en définissant les paramètres dans un fichier ini et en passant le chemin du fichier en tant que paramètre dans la ligne de commande.

Nous allons utiliser la deuxième option: nous allons créer un fichier .ini, y placer tous les paramètres et lancer le serveur uwsgi avec cette commande: uwsgi --ini /path/to/uwsgi.ini

Créons un dossier “config” à la racine du projet et mettons le fichier uwsgi.ini à l’intérieur (vous pouvez changer le nom). Découvrez ci-dessous à quoi ressemblera le contenu.

[uwsgi]
# variables
projectname = ProjectName
base = /absolute/path/to/project/

# configuration
master = True
pythonpath = %(base)
chdir = %(base)
env = DJANGO_SETTINGS_MODULE=%(projectname).settings
module = [ProjectName].wsgi:application
socket = /tmp/%(projectname).sock
http-socket = 127.0.0.1:8001
uid = 33
gid = 33
touch-reload = %(base)/config/uwsgi.ini
vacuum = True
processes = 5
harakiri = 40

Brève description des paramètres ci-dessus:

  • projectname: contenant le nom du projet
  • base: contenant le chemin absolu du projet
  • master: utiliser pour lancer le processus en tant que maître.
  • pythonpath: est le chemin absolu vers le code source du projet. Dans notre cas, utilisez la variable de base(%(base)).
  • chdir: le dossier à partir duquel nous voulons le lancer. Dans notre cas, nous le lancons depuis le dossier du projet.
  • env: définit les variables d’environnement au démarrage. Nous allons définir DJANGO_SETTINGS_MODULE qui contient les paramètres du projet.
  • module: dans ce cas, il s’agit de: [ProjectName] .wsgi: application
  • socket: où le socket sera créé. Nous avons choisi de le créer dans / tmp / avec le nom du projet.
  • http-socket: il s’agit de faire parler nativement votre projet avec le protocole HTTP.
  • uid et gid: pour définir l’utilisateur et le groupe qui sera utilisé pour lancer le processus. Cela peut être utile pour gérer les droits d’accès.
  • touch-reload: utilisez-le pour recharger le processus chaque fois que la date de dernière modification de ce fichier est modifiée. Cela peut être utilisé pour gérer les modifications.
  • vacuum: pour supprimer le socket avec la fin du processus.
  • processes: pour définir le nombre de processus à lancer.
  • harakiri: une requête sera supprimée si l’exécution prend plus de temps que ce paramètre.

Une fois la configuration terminée, vous pouvez utiliser cette commande (uwsgi --ini /path/to/config.ini ) pour lancer votre projet.

Maintenant, donnons accès au projet au public en configurant nginx.

Configuration de nginx

Le but ici est de configurer un proxy inverse dans nginx pour communiquer avec votre projet. Nous supposons que nginx est déjà installé si ce n’est pas le cas, tapez simplement cette commande: sudo apt-get install nginx pour l’installer.

Créez un fichier de configuration dans /etc/nginx/sites-enabled/[NomProjet].conf et dans ce fichier, vous pouvez placer l’exemple de configuration ci-dessous.

upstream [NomProjet] {
    server unix:///tmp/[NomProjet].sock;
}

server {
    listen 80;

    server_name example.domaine.com;

    location /static/ {
        alias /chemin/vers/projet/static/;
    }

    location /media/ {
        alias /chemin/vers/projet/media/;
    }

    location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass [NomProjet];
    }
}

Remplacez [ProjectName] par le nom de votre projet. Une fois la configuration OK, rechargez nginx et vous avez terminé. Vous pouvez maintenant accéder à votre projet via Internet avec votre nom de domaine.

Conclusion

La configuration précédemment effectuée permet de déployer votre projet Django en mode production. Le paramètre touch-reload m’aide vraiment à gérer les changements sur mon projet. Chaque fois que je fais une modification, j’ai juste besoin de taper cette commande pour recharger le projet: touch /path/to/uwsgi.ini et appliquez les dernières modifications.

Sources:

Comments:

Leave a reply