繁体   English   中英

在virtualenv中使用django的apache mod_wsgi错误

[英]apache mod_wsgi error with django in virtualenv

我似乎无法找到一个好的答案。 在将其作为WSGIDaemon运行时,谁需要拥有virtualenv? 我假设我的操作系统(Ubuntu 16)www-data,但我想确定。 尝试一些新的东西,让这个东西根据这篇文章的答案来运作......

django apache配置与WSGIDaemonProcess无法正常工作

django项目,virtualenv文件夹或两者都需要由apache组拥有吗? 在没有指定端口的情况下,需要为django项目提供什么样的所有权? 为什么我会得到以下内容?

根本问题:

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

当我启动Apache时,我收到此错误。 我遵循了几个不同的指南,包括: http//modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.htmlhttps://docs.djangoproject.com/en/1.10/howto/部署/ wsgi / modwsgi /但没有成功。

我的虚拟环境路径是/usr/local/virtualenvs/servicesite

我的django项目路径是/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>

[...]

您不需要为Django生成的原始wsgi.py任何内容进行更改。 通常有足够的:

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是很长一段时间的首选方式,并且使用它可以确保当你不以正确的方式做事时,事情会以更明显的方式失败。

一些非常重要的事情。

首先,必须为您要使用的特定Python主要/次要版本编译mod_wsgi。

其次,必须使用与编译mod_wsgi相同的Python安装来创建Python虚拟环境。 您不能针对系统Python安装编译mod_wsgi,而是让您的虚拟环境基于/usr/local相同主要/次要版本的单独Python安装。

第三,Apache运行代码的用户必须具有对主Python安装,虚拟环境和应用程序代码的任何目录/文件的读访问权。 当您将东西粘贴在主目录下时,它通常不具有访问权限,因为主目录禁止其他人读取主目录中的任何内容。

第四,如果将mod_wsgi守护程序进程组设置为以与Apache用户不同的用户身份运行,那么Apache用户仍然必须至少能够读取wsgi.py文件和所有目录。

进一步阅读更新的虚拟环境:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM