2016-10-09 19 views
3

Я не могу найти хороший ответ на этот вопрос. Кому нужно владение virtualenv при запуске его как WSGIDaemon? Я предполагаю на своей ОС (Ubuntu 16) www-data, но я хочу быть уверен. Попытка некоторых новых вещей, чтобы получить эту вещь, работающие на основе от ответа с этим поста ...Ошибка apache mod_wsgi с django in virtualenv

django apache configuration with WSGIDaemonProcess not working

ли проект Джанго папки virtualenv или оба должен принадлежать группе апача? Какие владельцы должны быть на месте, чтобы служить проекту джанго, не указав порт? Почему я получаю следующее?

Корень проблемы:

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

Когда я начинаю апача, я получаю эту ошибку. Я следил за несколькими разными гидами, в том числе: http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html и https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/ но у него был нулевой успех.

Мой виртуальный путь среда /usr/local/virtualenvs/servicesite

Мой путь Джанго проект /home/addohm/projects/rtservice/servicesite это где manage.py проживает, который оставляет /home/addohm/projects/rtservice/servicesite/servicesite как место моего 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/ 
<Directory /home/addohm/projects/rtservice/servicesite/static/> 
     Require all granted 
</Directory> 

<Directory /home/addohm/projects/rtservice/servicesite/servicesite> 
     <Files wsgy.py> 
       Require all granted 
     </Files> 
</Directory> 

[...]

ответ

7

Вы не должны нужно что-то изменить в оригинале wsgi.py от Django для вас. Это, как правило, достаточно иметь:

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

Конфигурация Apache должен затем быть предпочтительно:

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/ 
<Directory /home/addohm/projects/rtservice/servicesite/static/> 
     Require all granted 
</Directory> 

<Directory /home/addohm/projects/rtservice/servicesite/servicesite> 
     <Files wsgy.py> 
       Require all granted 
     </Files> 
</Directory> 

То есть, использовать python-home для расположения каталога, указанного sys.prefix для виртуальной среды. Избегайте использования python-path и ссылайтесь на каталог site-packages. Использование python-home было предпочтительным способом в течение очень долгого времени, и использование этого гарантирует, что вещи потерпят неудачу более очевидным образом, когда вы не делаете что-то правильно.

Несколько очень важных вещей.

Первый заключается в том, что mod_wsgi должен быть скомпилирован для конкретной основной/младшей версии Python, которую вы хотите использовать.

Во-вторых, виртуальная среда Python должна быть создана из той же установки Python, с которой был скомпилирован mod_wsgi. У вас не должно быть mod_wsgi, скомпилированного по сравнению с установкой системы Python, но ваша виртуальная среда основана на отдельной установке Python для той же основной/младшей версии в /usr/local.

В-третьих, пользователь, которому Apache запускает ваш код, должен иметь доступ для чтения к любым каталогам/файлам для основной установки Python, виртуальной среды и вашего кода приложения. Когда вы вставляете материал в домашний каталог, он обычно не будет иметь доступа, поскольку домашний каталог запрещает другим читать что-либо в домашнем каталоге.

В-четвертых, если группа процессов демона mod_wsgi настроена на работу как другой пользователь, чем пользователь Apache, пользователь Apache по-прежнему должен иметь возможность читать файл wsgi.py и все каталоги до этой точки.

Дальнейшее чтение на виртуальных средах, более до даты:

+0

Этот код кажется исправить корень проблемы я видел. Мне просто нужно выяснить мои разрешения сейчас. Я добавил каталог проекта django в группу: www-data, но этого, возможно, не было достаточно. Продолжение следует. Надо забрать жену из аэропорта! Большое спасибо за Вашу помощь. Я с нетерпением жду этого, благодаря вашей помощи :) – Flibertyjibbet

+0

@GrahamDempleton вы бы рекомендовали вместо этого сохранить все файлы проекта Django в папке '/ var/www/projects' и оставить папки virtualenv в '/ usr/местные/virtualenvs? – Flibertyjibbet

+0

@GrahamDempleton В вашей первой/второй точке, если я правильно вас понимаю, мне в основном нужно убедиться, что моя виртуальная среда была создана в той же среде python, в которой я установил mod_wsgi? Как я могу убедиться, что все правильно выровнено? – Flibertyjibbet

Смежные вопросы