Plusieurs fois, j’ai été amené à déployer mes projets Django sur des serveurs Apache et à chaque fois, j’ai eu des galères, jusqu’à vraiment comprendre comment fonctionnait Apache avec Django via le module Apache mod_wsgi.
Premièrement je t’expliquerai étape par étape comment déployer un projet Django sur un serveur Centos 7 ou 8 (ou RedHat c’est pareil) avec Apache puis je vais t’expliquer quoi faire en cas de problème.
Parce que c’est sur Centos que j’ai eu le plus de difficulté à déployer mes projets.
Déploiement de notre projet Django apache centos
- On installe Apache2 (httpd sur centos) et on le lance :
yum install httpd
service httpd start
systemctl enable httpd # Pour l'activer par défaut
2. On copie son projet dans /var/www , ce qui nous donne :
/var/www/projet
3. On installe Python 3 et le mod_wsgi qui est le module Apache permettant de communiquer avec le fichier wsgi.py de notre projet :
yum install python3-mod_wsgi.x86_64
4. On installe le module pyton virtualenv (qui sert à créer des environnement virtuel python):
pip install virtualenv
5. On crée notre environnement virtuel Python dans /var/www/venv et on le source pour l’utiliser :
virtualenv -p python3 /var/www/venv
source /var/www/venv/bin/activate
6. On installe toutes les librairies requises de notre projets Django et si tu as un fichier requirements.txt tu peux faire :
pip install –r requirements.txt
Si tu as besoin d’en savoir plus sur les environnement virtuels, sur pip et les différentes librairie, voici la doc officielle.
7. On se place dans /etc/httpd/conf.d et on crée le fichier django.conf qui contiendra :
ServerName centos8.localdomain
LoadModule wsgi_module modules/mod_wsgi.so
WSGIDaemonProcess projet python-home=/var/www/venv python-path=/var/www/projet
WSGIProcessGroup projet
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias / /var/www/projet/projet/wsgi.py
<Directory /var/www/projet/projet>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static /var/www/projet/static
<Directory /var/www/projet/static>
Require all granted
</Directory>
remplace projet par le nom de ton projet
8. On doit ensuite changer le propriétaire du projet par apache, pour qu’Apache puisse pleinement utiliser les fichiers du projet :
chown –R apache:apache var/www/projet
9. Et enfin on désactive la dernière couche de sécurité qui empêche Apache de fonctionner correctement :
setsebool -P httpd_can_network_connect_db on
setsebool -P httpd_read_user_content on
setsebool -P httpd_unified on
Cette commande active les booléens SElinux des modules Apache qui empêchent le bon fonctionnement de notre serveur.
J’ai mis du temps avant de comprendre que mon problème avec le déploiement de serveurs Django sur Centos venait de SElinux.
Maintenant si tu ouvres ton navigateur et lance l’URL http://nom_de_ton_serveur tu accéderas à ton site Django
Si ça ne fonctionne pas, le seconde partie de l’article ci-dessous t’explique comment trouver l’origine du problème.
Découvrir l’origine d’un problème avec Django Apache
Déjà on check si le service httpd est en cours :
service httpd status
Si ce n’est pas le cas, on le relance :
service httpd restart
Si on a une erreur et que le service httpd ne se relance pas, pour en connaître la cause on tape :
journalctl -u httpd -f
Cette commande nous affiche les logs du service et on peut y voir le message d’erreur qui nous donne la raison pour laquelle le serveur ne peut pas relancer le service.
Une fois ce problème résolu et que le service httpd est bien démarré, si l’URL http://nom_de_ton_serveur n’affiche toujours pas notre site on regarde cette fois les logs de /var/log/httpd/error_log avec la commande :
tail /var/log/httpd/error_log
Cette commande affiche les dernières lignes de /var/log/httpd/error_log qui afficheront les erreurs.
Si tu ne comprend pas d’où viennent ces erreurs, tu peux essayer de désactiver SElinux de manière temporaire pour t’assurer que le dysfonctionnement ne vient pas de là, pour cela tape :
setenforce 0
Ensuite on restart Apache :
service httpd restart
Si le problème n’est pas résolu alors SElinux n’en est pas la cause mais si le site s’affiche correctement alors SElinux est donc l’origine de notre problème.
Dans ce cas, tu peux soit désactiver SElinux de manière permanente en éditant le fichier /etc/selinux/config et en passant la variable SELINUX sur disable :
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
Puis redémarrer le serveur.
Ou tu peux activer 1 à 1 les booléens de SElinux pour comprendre lequel fait défaut.
Pour visualiser les booléens httpd de SElinux :
semanage boolean -l | grep httpd
Pour activer un booléen (par exemple httpd_read_user_content) :
setsebool -P httpd_read_user_content on
-P pour que ce soit permanent.
Voilà c’est la fin de ce cours, j’espère t’avoir donné les cartes en main pour réaliser ton déploiement ou au moins t’avoir donné des pistes pour résoudre tes soucis.
N’hésite pas visiter les autres articles et tuto de Linux-Man.