在virtualenv中,Django的Apache mod_wsgi错误

Flibertyjibbet

我似乎找不到一个好的答案。将其作为WSGIDaemon运行时,谁需要拥有virtualenv?我假设在我的操作系统(Ubuntu 16)上使用www-data,但是我想确定一下。根据这篇文章的答案,尝试一些新的事情来使此事情正常工作...

带有WSGIDaemonProcess的Django Apache配置不起作用

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>

[...]

格雷厄姆·邓普顿

您无需更改wsgi.pyDjango为您生成的原始文件中的任何内容通常具有以下条件就足够了:

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,但是要使您的虚拟环境基于的单独Python安装针对中的相同主要/次要版本/usr/local

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

第四,如果将mod_wsgi守护程序进程组设置为以与Apache用户不同的用户身份运行,则Apache用户至少仍必须具有读取该wsgi.py文件以及所有文件的能力

有关虚拟环境的更多最新信息:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django在mod_wsgi(Linux)上的apache上-403 Forbidden

apache和mod_wsgi的多个django网站

Django,Apache和mod_wsgi

网关超时,在Apache上使用Django和mod_wsgi

具有virtualenv和mod_wsgi的Apache:ImportError:没有名为“ django”的模块

pip install mod_wsgi在virtualenv中失败

500内部服务器错误mod_wsgi apache“ importerror:No Module named'django'

Django的mod_wsgi错误:从守护进程读取响应标头时超时

在apache2.4上安装mod_wsgi时发生错误

与mod_wsgi相关的Django https ssl配置错误

安装mod_wsgi + django时出现httpd.config错误

Python BaseHTTPServer与Apache和mod_wsgi

Apache mod_wsgi和Qt

WSGIDaemon进程语法错误-Mod_wsgi django ImportError:没有名为django.core.wsgi的模块

使用mod_wsgi用apache设置Django

Django内部500错误:尝试设置mod_wsgi

我的virtualenv没有考虑在内吗?[Apache,mod_wsgi和django]

使用mod_wsgi和apache2的服务器内部错误

使用mod_wsgi CSRF验证的Apache上的Django失败

Django(mod_wsgi)处理WSGI脚本时发生异常

Apache2 带有 mod_wsgi python3 'TypeError:' 并返回错误 500

Django 和 mod_wsgi python 版本?

在 Google Compute Engine 上为 Flask 配置 Apache WSGI(使用 mod_wsgi 的 Flask 导入错误)

Apache 和 mod_wsgi 的几个进程

Django:使用 mod_wsgi 创建的 SOCK 文件的权限错误

Apache、Django 和 mod_wsgi

无法在 Apache (mod_wsgi) 上部署官方 Django 教程

ubuntu 16 上的 500 内部服务器错误 django + mod_wsgi + apache2

Redhat 中的 Apache 服务器 mod_wsgi 给出 500 错误