Deployer une application Django avec Gunicorn et Nginx

Django en tant que framework Web a besoin d’un serveur Web pour fonctionner. Et comme la plupart des serveurs Web ne communiquent pas nativement avec Python, il y a besoin d’une interface pour permettre cette communication.
WSGI est le standard Python principal pour la communication entre les serveurs Web et les applications.

Le serveur de développement intégré de Django (python manage.py runserver) n'est pas conçu pour être utilisé en production car il manque de performance, de sécurité, et de fiabilité.
Gunicorn, en revanche, est conçu pour être un serveur de production. Gunicorn est capable de gérer de multiples requêtes simultanément de manière efficace ce qui est essentiel pour les applications web en production.

Gunicorn est souvent utilisé avec des serveurs web comme Nginx ou Apache. Nginx, par exemple, peut agir en tant que reverse proxy, traitant les requêtes HTTP et les envoyant à Gunicorn.
Cela permet d'optimiser la performance et de mieux gérer les charges de travail.

Etape 1: Installez Gunicorn :

source .env/bin/activate
pip install gunicorn

Etape 2: Testez Gunicorn :

|-src
|   |-blog
|   |    |-wsgi.py
|   |    |-settings.py
|   |    |-urls.py
|   |    |-...
Placer vous dans le repertoire src/

gunicorn blog.wsgi:application --bind 127.0.0.1:8000

Testez votre application dans un navigateur.
Si la mise en page n'est pas bonne, c'est que les fichiers statiques ne sont pas correctement servis par Django.

Ajoutez également ces lignes en bas du fichier blog/urls.py +.

if settings.DEBUG:
   urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
   urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_URL)

Ajoutez ces lignes d’importation en haut du fichier blog/urls.py.

from django.conf import settings # new
from django.conf.urls.static import static # new

Etape 3: Configurer Gunicorn :

Désactivez l’environnement virtuel:

deactivate

Créez un fichier de socket système pour Gunicorn:

sudo nano /etc/systemd/system/gunicorn.socket

Copier le contenu ci-dessous et enregistrer le fichier:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Ensuite, créez un fichier de service pour Gunicorn :

sudo nano /etc/systemd/system/gunicorn.service

Copier le contenu ci-dessous et enregistrer le fichier:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=your_user
Group=www-data
WorkingDirectory=/home/your_user/blogprojectdrf
ExecStart=/home/your_user/blogprojectdrf/env/bin/gunicorn \
   --access-logfile - \
   --workers 3 \
   --bind unix:/run/gunicorn.sock \
   blog.wsgi:application

[Install]
WantedBy=multi-user.target

Le groupe www-data est généralement créé par défaut lors de l'installation de serveurs web tels qu'Apache ou Nginx.
Si vous avez installé l'un de ces serveurs, le groupe www-data devrait déjà exister.Vous pouvez vérifier si le groupe www-data existe déjà en utilisant la commande suivante :

getent group www-data

Ajouter l'utilisateur your_user au groupe www-data :

sudo adduser your_user
sudo usermod -aG www-data your_user
sudo chown -R your_user:www-data /home/your_user/blogprojectdrf

Démarrez et activez le socket Gunicorn :

sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

Pour vérifier le statut de gunicorn :

sudo systemctl status gunicorn

Pour tester gunicorn :
Placez vous dans le repertoire src/

sudo gunicorn blog.wsgi:application --bind 127.0.0.1:8000

Etape 4: Installer Nginx :

sudo apt install nginx

Etape 5: Configurer Nginx pour Utiliser le Socket Gunicorn :

Avant de créer le fichier Nginx, avec cette commande, vous pouvez vérifier l'existence du fichier:

cd /etc/nginx/sites-enabled

Vous pouvez supprimer le fichier par défault à l'aide de cette commande :

sudo rm /etc/nginx/sites-enabled/default

Etape 6: Configurer Nginx comme proxy inverse :

Créez un fichier de configuration pour Nginx:

sudo touch /etc/nginx/sites-available/blog
sudo nano /etc/nginx/sites-available/blog

Copier le contenu ci-dessous et enregistrer le fichier:

server {
   listen 80 default_server;
   server_name your_domain_or_IP;;
   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
      alias /home/your_user/blogprojectdrf/static/;
   }
   location /media/ {
      alias /home/your_user/blogprojectdrf/media/;
   }
   location / {
      proxy_pass http://unix:/run/gunicorn.sock;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }
}

Activez la configuration :

sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/

Tester la Configuration de Nginx:

sudo nginx -t

Testez un fichier statique:
si besoin accorder les droits de lecture au groupe www-data

sudo chown -R your_user:www-data /home/your_user/blogprojectdrf
sudo chmod 750 /home/your_user/blogprojectdrf

Redémarrez Nginx et Gunicorn :

sudo systemctl daemon-reload
sudo systemctl restart nginx
sudo service gunicorn restart
sudo service nginx restart

Etape 7: Vérifier l'Accès au Site Localement :

Ouvrez votre navigateur et accédez à http://localhost ou http://127.0.0.1 pour vérifier que votre application Django est correctement déployée et fonctionne avec Gunicorn et Nginx.

Pour vérifier le statut de gunicorn :

sudo systemctl status gunicorn

Pour vérifier les journaux d’erreurs de Nginx :

To check error logs:

$ sudo tail -f /var/log/nginx/error.log

Pour vérifier si Nginx fonctionne correctement :

$ sudo systemctl status nginx
sudo fuser -k 8000/tcp
sudo lsof -t -i tcp:8000 | xargs kill -9

Cela permet de vérifier l’état de Nginx, d’arrêter tout processus utilisant le port 8000 et de tuer les connexions actives sur ce port.