【问题标题】:Django Apache and Virtualenv ImportError: No module named siteDjango Apache 和 Virtualenv ImportError:没有名为站点的模块
【发布时间】:2017-04-21 15:54:21
【问题描述】:

504 页面后来自 apache 的错误

[info] mod_wsgi (pid=): Python home /var/venv/mybox.
[info] mod_wsgi (pid=): Initializing Python.
ImportError: No module named site

这是一个几乎没有配置的应用程序。

<IfModule mod_wsgi.c>
WSGIDaemonProcess myapp python-home=/var/venv/mybox
WSGIProcessGroup myapp
WSGIScriptAlias / /var/www/html/web/myapp/wsgi.py
WSGISocketPrefix /var/run/wsgi

<Directory /var/www/html/web>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
</IfModule>

尽我所能关注每一篇文章和教程。我在 CENTOS6 上。使用虚拟环境 python 2.7 默认系统环境是 2.6

$ ldd /etc/httpd/modules/mod_wsgi.so
  linux-vdso.so.1 =>  (0x00007ffc06174000)

mywsgi.py

 import os,sys     
 from django.core.wsgi import get_wsgi_application     
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
 sys.path.insert(0,'/var/www/html/web')
 activate_this = '/var/venv/mybox/bin/activate_this.py'
 execfile(activate_this, dict(__file__=activate_this))
 application = get_wsgi_application()

PYHTONHOME 未设置

【问题讨论】:

    标签: django virtualenv mod-wsgi centos6


    【解决方案1】:

    我在 centos6.X 上使用 python 2.7,重新安装 mod_wsgi 为我解决了这个问题。

    yum remove mod_wsgi.x86_64
    yum install mod_wsgi.x86_64
    /etc/init.d/httpd restart 
    

    【讨论】:

      【解决方案2】:

      在 Ubuntu 上,如果您想使用 python3,则必须卸载 libapache2-mod-wsgi-py 并安装 libapache2-mod-wsgi-py3,如果您从存储库获取您的 mod_wsgi。

      【讨论】:

        【解决方案3】:

        在 CentOS 7 中用 Apache 2.4.6 解决

        我的整个服务器使用 Python 2.7,但我已经安装了 Python 3.6,而我的 virtualenv 正在使用 Python 3.6。

        使用此代码配置 djang.conf (/etc/httpd/conf.d/django.conf) 后:

        <VirtualHost *:80>
        
        WSGIDaemonProcess myProj python-home=/home/user/django-site/env python-path=/home/user/django-site
        WSGIProcessGroup myProj
        WSGIScriptAlias /myProj /home/user/django-site/my-project/wsgi.py
        
        
        Alias /static /home/user/django-site/static
        <Directory /home/user/django-site/static>
            Require all granted
        </Directory>
        
        <Directory /home/user/django-site/my-project>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
        
        </VirtualHost>
        

        然后重新启动我的 apache

        sudo systemctl restart httpd
        

        我收到这个错误一千行 (/var/log/httpd/error_log)

        ImportError: No module named site
        ImportError: No module named site
        ImportError: No module named site
        ImportError: No module named site
        

        解决方案

        第一:

        sudo grep wsgi /var/log/httpd/error_log
        

        我知道了:

        [mpm_prefork:notice] [pid 62324] AH00163: Apache/2.4.6 (CentOS) PHP/7.0.33 mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
        

        注意 Python 版本 (2.7.5)。根据我的 Python 3.6 获取 mod_wsgi 的方法是:

        yum list *mod_wsgi*
        Installed packages
        mod_wsgi.x86_64                          3.4-18.el7                          @base
        Disponible packages
        python35u-mod_wsgi.x86_64                4.6.2-1.ius.centos7                 ius
        python36u-mod_wsgi.x86_64                4.6.2-1.ius.centos7                 ius
        

        然后我安装了python36u-mod_wsgi.x86_64包:

        sudo yum install python36u-mod_wsgi.x86_64
        

        然后我重启了Apache服务:

        sudo systemctl restart httpd
        

        并从日志中获得了这一新行:

        [Fri Mar 29 12:33:26.788716 2019] [mpm_prefork:notice] [pid 76317] AH00163: Apache/2.4.6 (CentOS) PHP/7.0.33 mod_wsgi/4.6.2 Python/3.6 configured -- resuming normal operations
        

        一切正常! :-)

        希望对您有所帮助。呸!

        【讨论】:

        • 这对我在 Centos 7 上使用 Python3.6 venv 环境有效。
        【解决方案4】:

        通过 mod_wsgi 使用虚拟环境的文档可以在以下位置找到:

        在您的情况下最重要的是以下部分:

        在该部分中它指出:

        当使用带有 mod_wsgi 的 Python 虚拟环境时,使用与 mod_wsgi 最初编译的相同 Python 安装创建它是非常重要的。不可能使用 Python 虚拟环境来强制 mod_wsgi 使用不同的 Python 版本,甚至是不同的 Python 安装。

        例如,当 mod_wsgi 最初是为 Python 2.7 编译时,您不能强制 mod_wsgi 使用使用 Python 3.5 创建的 Python 虚拟环境。这是因为最初编译它所针对的 Python 安装的 Python 库直接链接到 mod_wsgi 模块。

        所以很可能发生的事情是 mod_wsgi 是为 Python 2.6 编译的。在这种情况下,您不能强制它使用从 Python 2.7 创建的 Python 虚拟环境。执行此操作时,您将看到有关缺少 site 模块的错误。

        您需要从系统包中卸载 mod_wsgi 并从源代码安装 mod_wsgi,针对 Python 2.7 编译它。最简单的方法可能是使用pip install 方法,如下所述:

        运行 pip install 将其安装在您的虚拟环境中,然后按照“连接到 Apache 安装”部分中有关配置 Apache 以使用它的说明进行操作。

        【讨论】:

        • 无法将 /var/venv/mybox/lib/python2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so 加载到服务器中:无法打开共享对象文件:权限被拒绝。我尝试更改权限
        • 您的 SELinux 配置文件很可能不允许 Apache 使用该位置的内容。尝试在/var/www 下拥有虚拟环境。
        • 使用 pip 安装 mod_wsgi 并将 virtualenv 移动到 /var/www 有效。这是一个内部站点,因此我们可以做出妥协
        【解决方案5】:

        这是来自Documentation 写这个: WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py WSGIPythonPath /path/to/mysite.com

        <Directory /path/to/mysite.com/mysite>
        <Files wsgi.py>
        Require all granted
        </Files>
        </Directory>
        

        这是专门针对虚拟环境的,您需要将路径写入您的 python 虚拟环境的站点包:

        WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages
        

        问题也可能在 - PYTHONHOME

        更改标准 Python 库的位置。默认情况下, 在 prefix/lib/pythonversion 中搜索库和 exec_prefix/lib/pythonversion,其中 prefix 和 exec_prefix 是 安装相关目录,都默认为 /usr/local。

        当 PYTHONHOME 设置为单个目录时,它的值会替换两者 前缀和 exec_prefix。要为这些指定不同的值,请设置 PYTHONHOME 到前缀:exec_prefix。

        尝试清理您的PYTHONHOME:

        user$ export PYTHONHOME=
        

        【讨论】:

        • 我最初遵循该文档到 T。然后我尝试了 Graham Dumpleton 博客和教程。我总是遇到同样的错误
        • 尝试更改pythonhome位置
        猜你喜欢
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2018-12-21
        • 2021-01-28
        • 2015-06-06
        • 2013-02-02
        • 1970-01-01
        • 2014-01-30
        相关资源
        最近更新 更多