J'essaie de servir un petit projet Django avec la configuration Apache suivante:
Configuration de l'hôte virtuel Apache:
<VirtualHost *>
ServerName servername
[...]
<Directory "/path/to/project/project">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess project python-path=/path/to/project:/path/to/Envs/venv/lib/python3.5/site-packages
WSGIScriptAlias / /path/to/project/project/wsgi.py
</VirtualHost>
J'ai aussi le wsgi.py suivant:
import os
from Django.core.wsgi import get_wsgi_application
os.environ.setdefault("Django_SETTINGS_MODULE", "example.settings")
application = get_wsgi_application()
Je n'ai aucun problème pour servir des fichiers STATIC et des fichiers MEDIA.
J'ai également vérifié les autorisations et essayé d'utiliser récursivement 755, puis 777 dans le répertoire site-package de virtualenv. Ça n'a pas marché.
Mais lorsque j'essaie d'atteindre la racine de mon site, j'obtiens ce qui suit:
from Django.core.wsgi import get_wsgi_application
ImportError: No module named 'Django'
J'ai deviné qu'il s'agissait d'un problème lié au chemin Python depuis l'installation de Django dans virtualenv. Mais j’ai ajouté les chemins python appropriés à l’attribut python-path
de WSGIDaemonProcess
afin que je ne comprenne pas pourquoi cela ne fonctionne pas.
Je suppose aussi que je pourrais ajouter le répertoire approprié à mon chemin Python dans mon fichier wsgi.py en utilisant le module site
, mais j'aimerais comprendre pourquoi la configuration Apache que j'ai essayée ne suffit pas. Ai-je manqué quelque chose?
Il manque une directive WSGIProcessGroup
ou une option équivalente sur WSGIScriptAlias
; votre application n'est donc pas en cours d'exécution dans le groupe de processus démon dans lequel vous avez défini l'environnement virtuel.
Voir Utilisation du mode démon mod_wsgi
Je vous recommanderais également de vous assurer que le groupe d'applications est défini sur '% {GLOBAL}' s'il s'agit de la seule application que vous exécutez dans le groupe de processus daemon.
Donc utiliser:
WSGIScriptAlias / /path/to/project/project/wsgi.py \
process-group=project application-group=%{GLOBAL}
Il vaut également mieux utiliser python-home
pour l’environnement virtuel.
WSGIDaemonProcess project python-path=/path/to/project \
python-home=/path/to/Envs/venv
Voir:
Mon représentant n’a pas plus de 50 ans, je ne peux donc pas en parler, mais j’aimerais partager ma découverte.
Dans WSGIDaemonProcess, si vous utilisez Python 3.5, vous devez définir exactement comme @ graham-dumpleton, avec
python-home=/path/to/Envs/venv
définir explicitement.
Cependant, si vous utilisez Python 3.4 (ou une version plus ancienne de Python telle que 2.7 à ma connaissance), vous devrez le configurer comme suit:
python-path=/path/to/project:/path/to/Envs/venv/lib/python3.4/site-packages
tout comme ce que le demandeur a fait.
Vraiment bizarre.
Pour moi le problème était que j'avais le mod wsgi installé pour python2. Je devais le réinstaller pour python3:
Sudo apt-get install libapache2-mod-wsgi-py3