erreur apache mod_wsgi avec django dans virtualenv

Je ne peux pas sembler trouver une bonne réponse à cela. Qui doit posséder virtualenv lors de son exécution en tant que WSGIDaemon? Je suppose sur mon OS (Ubuntu 16) www-data, mais je veux être sûr. Essayer de nouvelles choses pour que cette chose fonctionne en fonction de la réponse de cet article …

django apache configuration avec WSGIDaemonProcess ne fonctionne pas

Le projet django, le dossier virtualenv ou les deux doivent-ils être la propriété du groupe apache? Quels propriétaires doivent être en place pour servir un projet Django sans spécifier de port? Pourquoi ai-je les éléments suivants?

Le problème racine:

Call to 'site.addsitedir()' failed for '(null)' 

Lorsque je lance apache, je reçois cette erreur. J’ai suivi plusieurs guides différents, notamment: http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html et https://docs.djangoproject.com/en/1.10/howto/ deployment / wsgi / modwsgi / mais sans succès.

Le chemin de mon environnement virtuel est /usr/local/virtualenvs/servicesite

Mon chemin de projet Django est /home/addohm/projects/rtservice/servicesite C’est ici que se trouve manage.py , ce qui laisse /home/addohm/projects/rtservice/servicesite/servicesite comme emplacement de wsgi.py.

wsgi.py:

 SERVICESITE = ['/usr/local/virtualenvs/servicesite/lib/python3.5/site-packages'] import os import sys import site prev_sys_path = list(sys.path) for directory in SERVICESITE site.addsitedir(directory) new_sys_path = [] for item in list(sys.path): if item not in prev_sys_path: new_sys_path.append(item) sys.path.remove(item) sys.path[:0] = new_sys_path """ **Doesn't seem to work, throwing error in apache logs** site.addsitedir('/usr/local/virtualenvs/servicesite/lib/python3.5/site-packages') """ from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "servicesite.settings") application = get_wsgi_application() DJANGO_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)), '..') sys.path.append(DJANGO_PATH) 

apache2.conf

[…]

 WSGIDaemonProcess servicesite python-path=/home/addohm/projects/rtservice/servicesite:/usr/local/virtualenvs/servicesite/lib/python3.5/site-packages WSGIProcessGroup servicesite WSGIScriptAlias / /home/addohm/projects/rtservice/servicesite/servicesite/wsgi.py Alias /static/ /home/addohm/projects/rtservice/servicesite/static/  Require all granted    Require all granted   

[…]

Vous ne devriez pas avoir besoin de changer quoi que ce soit dans l’original wsgi.py généré par Django pour vous. Il suffit généralement d’avoir:

 import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "servicesite.settings") application = get_wsgi_application() 

Votre configuration Apache devrait alors être de préférence:

 WSGIDaemonProcess service site python-home=/usr/local/virtualenvs/servicesite \ python-path=/home/addohm/projects/rtservice/servicesite WSGIProcessGroup servicesite WSGIScriptAlias / /home/addohm/projects/rtservice/servicesite/servicesite/wsgi.py Alias /static/ /home/addohm/projects/rtservice/servicesite/static/  Require all granted    Require all granted   

En d’autres sys.prefix , utilisez python-home pour l’emplacement du répertoire spécifié par sys.prefix pour l’environnement virtuel. Évitez d’utiliser python-path et en vous référant au répertoire site-packages . L’utilisation de python-home a été privilégiée pendant très longtemps et son utilisation garantit que les choses échouent d’une manière plus évidente lorsque vous ne faites pas les choses correctement.

Quelques choses très importantes.

La première est que mod_wsgi doit être compilé pour la version majeure / mineure spécifique de Python que vous souhaitez utiliser.

Deuxièmement, l’environnement virtuel Python doit être créé à partir de la même installation Python pour laquelle mod_wsgi a été compilé. Mod_wsgi ne peut pas être compilé avec une installation Python système, mais votre environnement virtuel est basé sur une installation Python séparée pour la même version majeure / mineure dans /usr/local .

Troisièmement, l’utilisateur qui exécute Apache doit avoir un access en lecture à tous les répertoires / fichiers pour l’installation principale de Python, l’environnement virtuel et le code de votre application. Lorsque vous collez des éléments sous un répertoire personnel, il n’y aura généralement pas d’access car le répertoire d’accueil interdit aux autres de lire quoi que ce soit dans le répertoire personnel.

Quasortingèmement, si le groupe de processus du démon mod_wsgi est configuré pour être un utilisateur différent de l’utilisateur Apache, l’utilisateur Apache doit toujours avoir la possibilité de lire le fichier wsgi.py et tous les répertoires qui s’y wsgi.py .

Lectures complémentaires sur les environnements virtuels plus à jour: