Django Apache和Virtualenv ImportError:没有名为site的模块

问题描述 投票:2回答:3

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上。使用virutal env python 2.7默认系统env是2.6

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

每一位SGI.朋友

 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
3个回答
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以使用它的说明进行操作。


3
投票

使用Apache 2.4.6在CentOS 7中解决

我的整个服务器都使用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>

并重新开始我的阿帕奇

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

一切正常! :-)

希望它能帮到你。 C啊!


1
投票

这取自qazxsw poi写的:WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py WSGIPythonPath /path/to/mysite.com

Documentation

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

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

问题也可能在 - WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages

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

当PYTHONHOME设置为单个目录时,其值将替换prefix和exec_prefix。要为这些值指定不同的值,请将PYTHONHOME设置为前缀:exec_prefix。

尝试清理你的PYTHONHOME

PYTHONHOME
© www.soinside.com 2019 - 2024. All rights reserved.