【问题标题】:apache mod_wsgi error with django in virtualenvvirtualenv中django的apache mod_wsgi错误
【发布时间】:2017-02-18 06:58:00
【问题描述】:

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

django apache configuration with WSGIDaemonProcess not working

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/deployment/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>

[...]

【问题讨论】:

    标签: python django apache ubuntu mod-wsgi


    【解决方案1】:

    您不需要更改 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 一直是首选方式,使用它可以确保当您没有以正确的方式做事时,事情会以更明显的方式失败。

    一些非常重要的事情。

    首先是 mod_wsgi 必须针对您要使用的特定 Python 主要/次要版本进行编译。

    其次,Python 虚拟环境必须从编译 mod_wsgi 的相同 Python 安装创建。您不能针对系统 Python 安装编译 mod_wsgi,但您的虚拟环境基于 /usr/local 中相同主要/次要版本的单独 Python 安装。

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

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

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

    【讨论】:

    • 这段代码似乎解决了我看到的根本问题。我现在只需要弄清楚我的权限。我确实将 django 项目目录添加到 :www-data 组,但这可能还不够。待续。要去机场接老婆!非常感谢你的帮助。感谢您的帮助,我期待着把它抛在身后:)
    • @GrahamDempleton 您是否建议将所有 Django 项目文件保留在“/var/www/projects”文件夹中,而将 virtualenv 文件夹保留在“/usr/local/virtualenvs”中?跨度>
    • @GrahamDempleton 关于你的第一点/第二点,如果我理解正确的话,我基本上需要确保我的虚拟环境是在我 pip 安装 mod_wsgi 的同一 python 环境下创建的?我怎样才能确保一切都正确对齐?
    • 如果您为 mod_wsgi 手动配置 Apache,您通常甚至不会使用 pip 可安装的 mod_wsgi。您将使用作为系统包安装的mod_wsgi 以匹配Apache 安装,或者您将使用configure/make/make install 方法从mod_wsgi 源代码编译。运行pip install mod_wsgi 时获得的mod_wsgi-express 脚本是一种完全独立的做事方式。 mod_wsgi 是作为系统包安装的吗?您如何安装mod_wsgi
    • 如果我没记错的话,mod_wsgi 不包含在分发存储库中(至少对于我的版本),所以我最终使用了 pip install。我将删除它并使用 make 重新编译。
    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多