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:
ปั้มไลค์
June 27, 2020 at 3:15 amLike!! Thank you for publishing this awesome article.