Django Installation · 19 min read · Oct 13, 2025

Comment installer Django avec Postgres, Nginx et Gunicorn sur Rocky Linux 9

Django est un framework Python utilisé pour développer des sites Web et des applications dynamiques. Il suit l’architecture MVC (Modèle-Vue-Contrôleur). L’utilisation de Django accélère le processus de développement des applications, car la plupart des tâches sous-jacentes sont gérées par celui-ci.

Dans ce tutoriel, vous apprendrez comment installer le framework Django sur un serveur Rocky Linux 9. Vous créerez également un projet de démonstration et le testerez.

Prérequis

  • Un serveur exécutant Rocky Linux 9.

  • Un utilisateur non-root avec des privilèges sudo.

  • Un nom de domaine entièrement qualifié (FQDN) pointant vers votre serveur. Pour nos besoins, nous utiliserons django.example.com comme nom de domaine.

  • Assurez-vous que tout est à jour. $ sudo dnf update

  • Installez des paquets utilitaires de base. Certains d’entre eux peuvent déjà être installés. $ sudo dnf install wget curl nano unzip yum-utils -y

  • SELinux est désactivé.

Étape 1 - Configurer le pare-feu

La première étape consiste à configurer le pare-feu. Rocky Linux utilise Firewalld Firewall. Vérifiez l’état du pare-feu.

$ sudo firewall-cmd --state
running

Le pare-feu fonctionne avec différentes zones, et la zone publique est celle par défaut que nous allons utiliser. Listez tous les services et ports actifs sur le pare-feu.

$ sudo firewall-cmd --permanent --list-services

Il devrait afficher la sortie suivante.

cockpit dhcpv6-client ssh

Django a besoin des ports HTTP et HTTPS pour fonctionner. Ouvrez-les.

$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent

Rechargez le pare-feu pour appliquer les modifications.

$ sudo firewall-cmd --reload

Étape 2 - Installer PostgreSQL et les utilitaires

Rocky Linux 9 est livré avec une version plus ancienne de PostgreSQL. Nous allons installer Postgres 14 pour notre tutoriel.

Installez le RPM du dépôt pour PostgreSQL.

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Installez le serveur PostgreSQL 14.

$ sudo dnf install -y postgresql14-server postgresql14-contrib postgresql14-devel python3-psycopg2

Initialisez la base de données.

$ sudo /usr/pgsql-14/bin/postgresql-14-setup initdb

Activez et démarrez le service PostgreSQL.

$ sudo systemctl enable postgresql-14 --now

Vérifiez l’état du service.

$ sudo systemctl status postgresql-14
? postgresql-14.service - Serveur de base de données PostgreSQL 14
     Loaded: loaded (/usr/lib/systemd/system/postgresql-14.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2022-09-12 01:17:24 UTC; 2s ago
       Docs: https://www.postgresql.org/docs/14/static/
    Process: 87995 ExecStartPre=/usr/pgsql-14/bin/postgresql-14-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 88000 (postmaster)
      Tasks: 8 (limit: 5915)
     Memory: 16.5M
        CPU: 60ms
     CGroup: /system.slice/postgresql-14.service
             ??88000 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
             ??88001 "postgres: logger "
             ??88003 "postgres: checkpointer "
             ??88004 "postgres: background writer "
             ??88005 "postgres: walwriter "
             ??88006 "postgres: autovacuum launcher "
             ??88007 "postgres: stats collector "
             ??88008 "postgres: logical replication launcher "

Sep 12 01:17:24 board.example.com systemd[1]: Starting PostgreSQL 14 database server...

Installons quelques utilitaires supplémentaires dont nous aurons besoin pour que Django fonctionne.

$ sudo dnf install -y python3 python3-devel python3-pip gcc

Pour résoudre d’éventuelles erreurs futures concernant pg_config non trouvé, vous devez ajouter le chemin vers le dossier bin de PostgreSQL. Ouvrez le fichier .bashrc pour l’édition.

$ nano ~/.bashrc

Ajoutez la ligne suivante à la fin du fichier.

export PATH=$PATH:/usr/pgsql-14/bin 

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Étape 3 - Configurer PostgreSQL

Connectez-vous à l’interface en ligne de commande de PostgreSQL.

$ sudo -i -u postgres psql

Créez une nouvelle base de données pour Django.

postgres=# CREATE DATABASE djangoapp;

Créez un nouvel utilisateur de base de données avec un mot de passe fort.

postgres=# CREATE USER djangouser WITH ENCRYPTED PASSWORD 'dbpassword';

Accordez les droits à l’utilisateur d’utiliser la base de données.

postgres=# GRANT ALL PRIVILEGES ON DATABASE djangoapp TO djangouser;

Quittez l’interface en ligne de commande de Postgres.

postgres=# \q

Étape 4 - Installer Django

Il existe plusieurs méthodes pour installer Django. Le choix de la méthode qui vous convient le mieux dépend de la façon dont vous souhaitez configurer votre environnement de développement et de vos besoins. Chaque méthode a ses propres avantages et inconvénients. Passons en revue toutes ces méthodes.

Installer avec pip

C’est la méthode la plus courante pour installer Django. La méthode recommandée consiste à créer un environnement Python virtuel. Cela vous permet d’installer des paquets Python sans affecter le système.

Créons un répertoire de projet de démonstration.

$ mkdir ~/sampleproject
$ cd ~/sampleproject

Créez un environnement virtuel en utilisant la commande suivante. Remplacez sample_env par le nom que vous souhaitez donner à votre environnement virtuel.

$ python3 -m venv sample_env

Cela installe une version portable de Python, pip dans votre répertoire de projet. Pour installer des paquets dans le projet, vous devez activer l’environnement en utilisant la commande suivante.

$ source sample_env/bin/activate

Votre invite de commande changera pour refléter l’environnement virtuel.

(sample_env) navjot@django:~/sampleproject$

Maintenant que l’environnement virtuel est activé, utilisez pip pour installer Django. Exécutez la commande suivante pour installer Django.

(sample_env) $ pip install django

Vérifiez l’installation.

(sample_env) $ django-admin --version
4.1.2

En fonction des exigences de votre projet, vous pouvez installer une version différente de Django de la manière suivante.

(sample_env) $ pip install django==3.2.1

Vérifiez l’installation.

(sample_env) $ django-admin --version
3.2.1

Comme vous pouvez le voir, cette méthode installe une version plus récente de Django que la version obtenue à partir du dépôt Rocky Linux.

Pour quitter l’environnement virtuel, exécutez la commande suivante.

(sample_env) $ deactivate

Installer la version de développement

Vous pouvez également utiliser pip pour installer la version de développement de Django. Pour cela, nous allons récupérer la version de développement à partir du dépôt Github de Django.

Clonez le dépôt dans le répertoire ~/django-dev en utilisant la commande suivante.

$ git clone https://github.com/django/django ~/django-dev

Passez au répertoire nouvellement créé.

$ cd ~/django-dev

Créez l’environnement virtuel.

$ python3 -m venv dev_django_env

Activez l’environnement.

$ source dev_django_env/bin/activate

Installez Django en utilisant pip. Le drapeau -e l’installe en mode éditable, ce qui est nécessaire si vous installez à partir du contrôle de version.

(dev_django_dev) $ pip install -e ~/django-dev

Vérifiez l’installation.

(dev_django_dev) $ django-admin --version
4.2.dev20221012095013

Comme vous pouvez le voir, la version ici est la dernière version de développement. La version de développement de Django n’est pas utile pour les environnements de production.

Étape 5 - Créer un projet d’exemple

Construisons un projet Django d’exemple. Créez un répertoire pour le projet d’exemple.

$ mkdir ~/dj-sample
$ cd ~/dj-sample

Créez un environnement virtuel Python.

$ python3 -m venv sample_proj

Activez l’environnement.

$ source sample_proj/bin/activate

Installez le paquet Wheel.

(sample_proj) $ pip install wheel

Installez Django et les paquets requis.

(sample_proj) $ pip install django psycopg2 psycopg2-binary

Pour construire le projet, nous devons utiliser la commande startproject. Cette commande crée un autre répertoire qui inclut :

  • Un script de gestion, manage.py, utilisé pour administrer des tâches spécifiques à Django.
  • Un répertoire portant le même nom que le projet qui inclut le code du projet.

Nous allons créer le répertoire du projet dans notre répertoire de travail actuel. Pour ce faire, utilisez le caractère point (.) à la fin de la commande suivante.

(sample_proj) $ django-admin startproject demoproject .

Django utilise la variable SECRET_KEY pour fournir une signature cryptographique. Il génère une valeur par défaut lors de l’installation. Vous devez la remplacer par une valeur sécurisée. Exécutez la commande suivante pour générer la clé et la copier pour plus tard.

(sample_proj) $ python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'

Vous obtiendrez la sortie suivante avec une clé.

wm#dzb^ymuo3s3tza=f5cx^kan!$4sch1!b-q=v%)=d0pb(jqf

La première étape consiste à ajuster les paramètres du projet. Ouvrez le fichier de paramètres pour l’édition.

(sample_proj) $ nano demoproject/settings.py

Remplacez la valeur actuelle de la variable SECRET_KEY par la clé que vous avez générée.

SECRET_KEY = 's)3m=4s&!a=p#brttcqu@1s$8(z6e+u8(^tkpw28qyj0t#8ku2'

Changez les paramètres de la section DATABASES comme suit.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'DATABASE_DB',
        'USER': 'DATABASE_USER',
        'PASSWORD': 'DATABASE_PASSWORD',
        'HOST': 'DATABASE_HOST',
        'PORT': 'DATABASE_PORT',
    },
}

Ensuite, déplacez-vous en bas du fichier et ajoutez un paramètre pour l’emplacement des fichiers statiques. Cela est important pour que Nginx fonctionne et gère les demandes pour ces fichiers. Ajoutez la ligne suivante au-dessus de la variable STATIC_URL.

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

Puisque la variable STATIC_ROOT utilise le module os, nous devons l’importer car il n’est pas importé par défaut. Ajoutez la ligne suivante au-dessus de la ligne from pathlib import Path.

import os

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Vérifiez les paramètres de la base de données.

(sample_proj) $ python manage.py check --database default

Vous devriez obtenir la sortie suivante.

System check identified no issues (0 silenced).

Ensuite, nous devons migrer la base de données en utilisant la commande migrate. Les migrations dans Django propagent les modifications que vous apportez à vos modèles dans le schéma de votre base de données.

(sample_proj) $ python manage.py makemigrations
(sample_proj) $ python manage.py migrate

Vous obtiendrez la sortie suivante.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

Ensuite, créez un utilisateur administratif pour accéder à l’interface d’administration de Django.

(sample_proj) $ python manage.py createsuperuser

Vous serez invité à entrer un nom d’utilisateur, un e-mail et un mot de passe.

Username (leave blank to use 'navjot'):
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.

Copiez les fichiers statiques dans le répertoire statique. Entrez yes lorsque vous y êtes invité.

(sample_proj) $ python manage.py collectstatic
130 static files copied to '/home/navjot/dj-sample/static'.

Étape 6 - Tester le serveur de développement

Il est temps de tester l’application. Pour cela, vous devez modifier la directive ALLOWED_HOSTS dans les paramètres de Django. Cette directive définit la liste des adresses IP et des noms de domaine qui ont accès à l’application Django.

Ouvrez le fichier de paramètres en utilisant la commande suivante.

(sample_proj) $ nano demoproject/settings.py

Trouvez l’entrée suivante.

ALLOWED_HOSTS = []

Entrez l’adresse IP de votre serveur dans les crochets. Chaque entrée doit être entourée de guillemets et plusieurs entrées doivent être séparées par des virgules. Entrer www.example.com sera exactement correspondant. Cependant, .example.com correspondra à example.com et www.example.com, et tout autre sous-domaine de example.com. Par conséquent, il est recommandé d’utiliser le point pour préfixer un nom de domaine afin de le faire correspondre et à ses sous-domaines.

ALLOWED_HOSTS = ['']

Nous avons utilisé l’adresse IP pour faire correspondre notre serveur. Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Avant de tester le serveur de développement, vous devez configurer le pare-feu pour permettre à Django de fonctionner. Django utilise le port 8000 par défaut. Ouvrez le port en utilisant le pare-feu simplifié (UFW).

(sample_proj) $ sudo firewall-cmd --add-port=8000/tcp --permanent
(sample_proj) $ sudo firewall-cmd --reload

Démarrez le serveur de développement.

(sample_proj) $ python manage.py runserver 0.0.0.0:8000

Lancez l’URL http://:8000 dans votre navigateur et vous obtiendrez l’écran suivant.

Page d'accueil de Django

Vous pouvez accéder à l’interface d’administration en suivant l’URL http://:8000/admin/ et vous verrez l’écran de connexion suivant.

Page de connexion Django

Entrez les identifiants créés précédemment pour vous connecter au panneau d’administration ci-dessous.

Panneau d'administration Django

Une fois que vous avez terminé avec votre projet de démonstration, vous pouvez fermer le serveur en appuyant sur Ctrl + C dans votre terminal.

Étape 7 - Installer et tester Gunicorn

Exécuter le serveur Django persistant en utilisant nohup

Jusqu’à présent, le service Django n’est pas persistant. Pour rendre le service persistant, il existe deux méthodes. La première méthode consiste à utiliser l’utilitaire nohup. Le nohup est une commande POSIX qui signifie no hang up. Il est utilisé pour exécuter des commandes de manière à ne pas s’arrêter même lorsqu’un utilisateur se déconnecte.

Assurez-vous d’avoir quitté le serveur depuis le terminal en appuyant sur Ctrl + C.

Exécutez la commande suivante pour exécuter le serveur de développement de Django.

(sample_proj) $ nohup python manage.py runserver 0.0.0.0:8000 &

Maintenant, votre serveur Django continuera de fonctionner jusqu’à ce que vous le tuiez manuellement. La commande vous donnera l’ID de processus et affichera une autre commande.

[1] 42595
(sample_proj) $ nohup: ignoring input and appending output to 'nohup.out'
^C

Appuyez sur Ctrl + C pour quitter. Le serveur Django d’origine continuera de fonctionner. Vous pouvez vérifier en ouvrant l’URL dans votre navigateur.

Une fois que vous avez terminé, vous devez tuer le processus. La commande nohup vous donne un ID de processus. Mais en réalité, deux processus sont en cours d’exécution. Pour trouver les ID des deux processus, exécutez la commande suivante.

(sample_proj) $ ps aux | grep manage.py
navjot    153474  1.6  3.9  46264 39016 pts/0    S    04:15   0:00 python manage.py runserver 0.0.0.0:8000
navjot    153475  3.0  4.4 196060 43500 pts/0    Sl   04:15   0:00 /home/navjot/dj-sample/sample_proj/bin/python manage.py runserver 0.0.0.0:8000
navjot    153483  0.0  0.2   6420  2248 pts/0    S+   04:15   0:00 grep --color=auto manage.py

Comme vous pouvez le voir, deux processus sont en cours d’exécution, l’un avec l’ID 153474 et l’autre avec l’ID 153475.

Exécutez la commande suivante pour arrêter le serveur en utilisant les ID de processus que vous avez obtenus ci-dessus.

(sample_proj) $ sudo kill -9 153474 153475

Installer Gunicorn

La deuxième méthode pour exécuter un serveur Django persistant nécessite d’installer Gunicorn et les serveurs Web Nginx. Gunicorn est un serveur HTTP WSGI Python. Il interagira avec l’application Django et ensuite Nginx agira comme un proxy inverse vers Gunicorn. Cette méthode a l’avantage supplémentaire de vous fournir la sécurité et la performance qui accompagnent l’utilisation de Nginx.

Installez Gunicorn.

(sample_proj) $ pip install gunicorn

Avant de continuer, nous devons tester la capacité de Gunicorn à servir le projet. Exécutez la commande suivante pour exécuter Gunicorn.

(sample_proj) $ gunicorn --bind 0.0.0.0:8000 demoproject.wsgi:application

Cela démarrera Gunicorn sur la même interface que celle sur laquelle Django fonctionnait. Pour vérifier, ouvrez l’URL http://:8000 dans votre navigateur et vous obtiendrez la même page d’accueil Django. Cela signifie que Gunicorn fonctionne parfaitement.

Lorsque vous avez terminé les tests, appuyez sur Ctrl + C dans le terminal pour quitter Gunicorn.

Désactivez l’environnement virtuel pour revenir à votre shell habituel.

(sample_proj) $ deactivate

Étape 8 - Créer un fichier Socket et un fichier Service pour Gunicorn

La première étape consiste à créer un fichier socket Gunicorn. Le socket Gunicorn sera créé au démarrage et écoutera les connexions. Lorsqu’une connexion se produit, systemd démarrera automatiquement le processus Gunicorn pour le gérer.

Créez et ouvrez le fichier socket Gunicorn pour l’édition.

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

Collez le code suivant dedans.

[Unit]
Description=socket gunicorn

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Ensuite, créez et ouvrez le fichier de service Gunicorn pour l’édition.

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

Collez le code suivant dedans.

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

[Service]
User=navjot
Group=nginx
WorkingDirectory=/home/navjot/dj-sample
ExecStart=/home/navjot/dj-sample/sample_proj/bin/gunicorn \
          -t 3000 \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          demoproject.wsgi:application -w 2

[Install]
WantedBy=multi-user.target

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité. Remplacez navjot par votre nom d’utilisateur système. Le groupe nginx permettra au serveur Nginx de communiquer avec Django.

Rechargez le démon système pour rafraîchir les fichiers systemd.

$ sudo systemctl daemon-reload

Activez et démarrez le fichier socket Gunicorn.

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

Vérifiez l’état du socket Gunicorn.

$ sudo systemctl status gunicorn.socket

Vous recevrez une sortie similaire.

? gunicorn.socket - socket gunicorn
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: disabled)
     Active: active (listening) since Thu 2022-10-13 04:19:28 UTC; 14s ago
      Until: Thu 2022-10-13 04:19:28 UTC; 14s ago
   Triggers: ? gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
     CGroup: /system.slice/gunicorn.socket

Oct 13 04:19:28 django.nspeaks.xyz systemd[1]: Listening on gunicorn socket.

Le service Gunicorn n’est toujours pas en cours d’exécution comme vous pouvez le vérifier.

$ sudo systemctl status gunicorn.service
? gunicorn.service - daemon gunicorn django
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ? gunicorn.socket

Pour tester le mécanisme d’activation du socket, exécutez la commande suivante.

$ curl --unix-socket /run/gunicorn.sock localhost

Vous recevrez la sortie HTML de la page d’accueil Django dans votre terminal. Cela démarre également Gunicorn pour servir l’application. Vérifiez à nouveau l’état du service et vous verrez qu’il fonctionne maintenant.

$ sudo systemctl status gunicorn.service
? gunicorn.service - daemon gunicorn django
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: disabled)
     Active: active (running) since Thu 2022-10-13 06:13:55 UTC; 1min 34s ago
TriggeredBy: ? gunicorn.socket
   Main PID: 157742 (gunicorn)
      Tasks: 4 (limit: 5915)
     Memory: 96.2M
        CPU: 1.198s
     CGroup: /system.slice/gunicorn.service
             ??157742 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
             ??157746 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
             ??157747 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
             ??157748 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
.......

Étape 9 - Installer Nginx

La dernière étape consiste à installer et configurer Nginx. Rocky Linux est livré avec une version plus ancienne de Nginx. Vous devez télécharger le dépôt officiel de Nginx pour installer la dernière version.

Créez et ouvrez le fichier /etc/yum.repos.d/nginx.repo pour créer le dépôt officiel de Nginx.

$ sudo nano /etc/yum.repos.d/nginx.repo

Collez le code suivant dedans.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Installez le serveur Nginx.

$ sudo dnf install nginx -y

Vérifiez l’installation.

$ nginx -v
nginx version: nginx/1.22.1

Activez et démarrez le serveur Nginx.

$ sudo systemctl enable nginx --now

Vérifiez l’état du serveur.

$ sudo systemctl status nginx
? nginx.service - nginx - serveur web haute performance
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Thu 2022-10-13 06:17:24 UTC; 1s ago
       Docs: http://nginx.org/en/docs/
    Process: 157900 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 157901 (nginx)
      Tasks: 2 (limit: 5915)
     Memory: 1.9M
        CPU: 18ms
     CGroup: /system.slice/nginx.service
             ??157901 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??157902 "nginx: worker process"

Oct 13 06:17:24 django.example.com systemd[1]: Starting nginx - serveur web haute performance...

Étape 10 - Installer SSL

Jusqu’à présent, votre application Django est servie via une connexion HTTP en texte clair. Il est fortement recommandé de la protéger via un certificat SSL. Pour cela, utilisez l’outil Certbot en utilisant l’outil Snapd. Il nécessite le dépôt EPEL pour fonctionner.

$ sudo dnf install epel-release

Nous allons utiliser Snapd pour installer Certbot. Installez Snapd.

$ sudo dnf install snapd

Activez et démarrez le service Snap.

$ sudo systemctl enable snapd.socket --now

Créez les liens nécessaires pour que Snapd fonctionne.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Installez le dépôt Snapd core.

$ sudo snap install core
$ sudo snap refresh core

Installez Certbot.

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Générez le certificat. La commande suivante configurera également automatiquement Nginx.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d django.example.com

La commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/django.example.com sur votre serveur.

Générez un certificat de groupe Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Pour vérifier si le renouvellement SSL fonctionne correctement, effectuez un essai à sec du processus.

$ sudo certbot renew --dry-run

Si vous ne voyez aucune erreur, vous êtes prêt. Votre certificat se renouvellera automatiquement.

Étape 11 - Configurer Nginx

Créez et ouvrez le fichier /etc/nginx/conf.d/django-gunicorn.conf pour l’édition.

$ sudo nano /etc/nginx/conf.d/django-gunicorn.conf

Collez le code suivant dedans.

# imposer HTTPS
server {
  listen 80 default_server;
  server_name django.example.com;
  return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name django.example.com;

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

    http2_push_preload on; # Activer le serveur HTTP/2 Push

    ssl_certificate /etc/letsencrypt/live/django.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/django.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/django.example.com/chain.pem;
    ssl_session_timeout 1d;

    # Activer les versions TLS (TLSv1.3 est requis pour le prochain HTTP/3 QUIC).
    ssl_protocols TLSv1.2 TLSv1.3;

    # Activer le 0-RTT de TLSv1.3. Utilisez $ssl_early_data lors du proxy inverse pour
    # éviter les attaques de rejeu.
    #
    # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
    ssl_early_data on;

    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:50m;

    # OCSP Stapling ---
    # récupérer les enregistrements OCSP à partir de l'URL dans ssl_certificate et les mettre en cache
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    add_header X-Early-Data $tls1_3_early_data;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/navjot/dj-sample;
    }

    location / {
        proxy_set_header Host $http_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;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

# Ce bloc est utile pour déboguer TLS v1.3. N'hésitez pas à le supprimer
# et à utiliser la variable `$ssl_early_data` exposée par NGINX directement si vous
# souhaitez le faire.
map $ssl_early_data $tls1_3_early_data {
  "~." $ssl_early_data;
  default "";
}

Remplacez l’emplacement racine dans le fichier ci-dessus par le répertoire sur votre serveur.

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Ouvrez le fichier /etc/nginx/nginx.conf pour l’édition.

$ sudo nano /etc/nginx/nginx.conf

Ajoutez la ligne suivante avant la ligne include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Vérifiez votre configuration Nginx.

$ sudo nginx -t

Si vous ne voyez aucune erreur, cela signifie que vous êtes prêt à partir.

Vous devrez également ajouter le nom de domaine à votre directive ALLOWED_HOSTS. Ouvrez le fichier settings.py.

$ nano ~/dj-sample/demoproject/settings.py

Changez la valeur de la variable ALLOWED_HOSTS.

ALLOWED_HOSTS = ['','django.example.com']

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Redémarrez le socket et le service Gunicorn.

$ sudo systemctl restart gunicorn.socket
$ sudo systemctl restart gunicorn.service

Rechargez le serveur Nginx.

$ sudo systemctl reload nginx

Ouvrez le port HTTP. Vous pouvez également supprimer le port 8000 si vous ne comptez plus l’utiliser.

$ sudo firewall-cmd --remove-port=8000/tcp --permanent
$ sudo firewall-cmd --reload

Vérifiez en ouvrant l’URL http://django.example.com et la page d’accueil Django se chargera.

Conclusion

Cela conclut notre tutoriel où vous avez appris à installer Django avec Gunicorn et Nginx sur un serveur Rocky Linux 9. Vous avez également installé un certificat SSL pour améliorer la sécurité de votre projet Django. Si vous avez des questions, postez-les dans les commentaires ci-dessous.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.