Le déploiement d'une appplication web Django en production nécessite une stack robuste. Cette configuration repose sur l'architecture suivante : CentOS, Python 3, Django, Nginx et uWSGI.
Préparation de l'Environnement et Dépendances
Avant de migrer le code source vers le serveur Linux, assurez-vous que Python 3, l'environnement virtuel et les dépendances du projet sont correctement initialisés. Lors de l'exécution de python manage.py runserver, une erreur liée à l'absence du module _sqlite3 peut survenir. Pour la corriger :
sudo yum install sqlite-devel
cd /path/to/python/source
sudo make
sudo make install
Installation et Configuration de uWSGI
uWSGI agit comme serveur d'application WSGI pour faire le pont entre le code Python et le serveur web. Il est recommandé de l'installer via pip pour obtenir la version la plus récente :
pip3 install uwsgi
À la racine du projet, créez un fichier de configuration nommé app_server.ini :
[uwsgi]
socket = 10.0.5.20:9000
chdir = /var/www/my_webapp
module = my_webapp.wsgi
master = true
processes = 4
pidfile = /var/www/my_webapp/server.pid
daemonize = /var/www/my_webapp/server.log
- socket : L'adresse IP interne et le port de communication avec le reverse proxy.
- chdir : Le répertoire absolu contenant le code source.
- module : Le point d'entrée WSGI de l'application.
- daemonize : Le chemin vers le fichier journal.
Déploiement avec Nginx
Nginx servira de reverse proxy pour gérer les requêtes HTTP et distribuer les fichiers statiques. Installez-le via le gestionnaire de paquets de votre distribution.
Modifiez le bloc server dans la configuration Nginx (nginx.conf) pour qu'il corresponde à l'instance uWSGI :
server {
listen 80;
server_name portal.example.com;
location / {
include uwsgi_params;
uwsgi_pass 10.0.5.20:9000;
}
location /assets/ {
alias /var/www/my_webapp/static_collected/;
}
}
Il est impératif que le port défini dans uwsgi_pass corresponde exactement à celui déclaré dans le fichier .ini de uWSGI, et qu'il soit différent du port d'écoute (listen) de Nginx. Appliquez les modifications :
sudo nginx -t
sudo nginx -s reload
Démarrage et Résolution des Erreurs Courantes
Lencez le serveur d'application :
uwsgi --ini app_server.ini
Si une erreur DisallowedHost apparaît dans les journaux lors de l'accès à l'application, Django bloque la requête par sécurité. Éditez le fichier settings.py :
DEBUG = False
ALLOWED_HOSTS = ['10.0.5.20', 'portal.example.com']
Tuez l'ancien processus uWSGI et relancez-le pour appliquer les changements :
killall -9 uwsgi
uwsgi --ini app_server.ini
Une erreur 400 Bad Request sans autre précision est généralement causée par un conflit de ports entre Nginx et uWSGI. Vérifiez que le port d'écoute HTTP n'est pas identique au port du socket uWSGI.
Configuration du Pare-feu
Pour permettre l'accès externe au service web, les règles de pare-feu doivent être ajustées.
Gestion avec Iptables
Pour ouvrir le port 80 :
sudo vim /etc/sysconfig/iptables
# Ajoutez la règle suivante :
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
sudo service iptables restart
Gestion avec Firewalld (CentOS 7+)
Sur les systèmes modernes utilisant systemctl, le pare-feu par défaut est firewalld. Voici les commandes pour exposer le trafic web :
sudo firewall-cmd --state
sudo systemctl start firewalld
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent
sudo firewall-cmd --reload