【问题标题】:Django/Apache & virtualenv on Ubuntu not using the right Python interpreterUbuntu 上的 Django/Apache 和 virtualenv 没有使用正确的 Python 解释器
【发布时间】:2015-09-18 02:13:38
【问题描述】:

我正在使用virtualenvapache2mod_wsgi 在 Ubuntu 上运行一个小型 Django 服务器。

我在 windows 和 linux 上都使用 python3 创建了 virtualenvpip --version 显示:

(env)lbr@irma-fr:/var/www/irmaweb/irmaweb$ pip --version
pip 7.0.3 from /var/www/irmaweb/env/lib/python3.4/site-packages (python 3.4)

它在 Windows 上运行良好,但在我的 Ubuntu 服务器上部署时出现以下错误:

错误是因为Django在/var/www中创建了一个新的空数据库,而不是在我的项目根目录中使用./manage.py migrate创建的数据库:

(env)lbr@irma-fr:/var/www/irmaweb/irmaweb$ ls -al /var/www
total 20
drwxrws---  5 lbr      www-data 4096 Jul  1 05:58 .
drwxr-xr-x 12 root     root     4096 Jun 26 09:53 ..
-rw-r--r--  1 www-data www-data    0 Jul  1 05:58 dev.db

但我认为问题的根源是因为 Django 是从 python2 调用的,如屏幕截图所示,而不是像我的 virtualenv 配置那样被 python3 调用。

下面是我的apache2 配置:

(env)lbr@irma-fr:/var/www/irmaweb/irmaweb$ cat /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
WSGIDaemonProcess irmaweb python-path=/var/www/irmaweb/irmaweb:/var/www/irmaweb/env/lib/python3.4/site-packages
WSGIProcessGroup irmaweb
WSGIScriptAlias / /var/www/irmaweb/irmaweb/irmaweb/wsgi.py
Alias /site_media/static/ /var/www/irmaweb/irmaweb/irmaweb/site_media/static/

所以我想我错过了一些东西!如何告诉 apache/wsgi 从我的 virtualenv 文件夹中调用 python:

(env)lbr@irma-fr:/var/www/irmaweb$ ls -al env/bin/python*
lrwxrwxrwx 1 lbr www-data       7 Jun 30 15:19 env/bin/python -> python3
-rwxrwxr-x 1 lbr www-data 4061272 Jun 30 15:19 env/bin/python3
lrwxrwxrwx 1 lbr www-data       7 Jun 30 15:19 env/bin/python3.4 -> python3

而不是使用 /usr/bin 中的系统 python 吗?

【问题讨论】:

  • 在我意识到我需要使用我想要运行应用程序的 Python 解释器专门编译 mod_wsgi 之前,我遇到了类似的问题。我还必须在我的 httpd.conf 中包含我编译的模块。一旦我这样做了,它就起作用了。也许我应该包括其中一些信息作为答案,但我不知道它是否会有所帮助。
  • 你能发布你的wsgi脚本吗?那是你激活你的 virtualenv 的地方
  • 正如其他人指出的那样,mod_wsgi 是为特定的 Python 主要/次要版本编译的。您不能强制为 Python 2.7 编译的 mod_wsgi 模块使用 Python 3.4 虚拟环境。如果使用系统 Python 3.4,则卸载 Python 2.7 的系统 mod_wsgi 包并安装 Python 3.4 版本。对于 Debian/Unbuntu 系统,适用于 OS Python 3.4 的 Python 3.4 变体在包名称上具有“-py3”后缀。如果操作系统没有提供 mod_wsgi 的 Python 3.4 变体,您将需要自己根据 Python 3.4 从源代码构建它。
  • @GrahamDumpleton,嗯,我完全只是在我的回答中链接了你的图书馆。感谢您使用开源工具。
  • 是的。看到您的回复并感谢您提供的详细信息。只是想提供一些额外的确认。

标签: python django apache virtualenv


【解决方案1】:

我不确定这是否会有所帮助,但我第一次在自定义 Python 环境 (3.4) 下使用 mod_wsgi 设置 Apache 时发现它很棘手。在确保 Apache 使用我的特定 Python 版本时,我也遇到了类似的问题。

以下是我让 Apache 和 mod_wsgi 使用自定义 Python 版本所经历的步骤。它们可能会有所帮助。

1.在全新安装 Ubuntu 时,我安装了 apache2apache2-dev。注意:我没有从 repos 安装 mod_wsgi

2.然后我下载了这个版本的mod_wsgi* 并针对我正在使用的特定 Python3.4 进行了编译(我之前也是从源代码构建的,但我认为没有必要这样做)。

3. 在我下载并解压mod_wsgi 的目录中,我以root 身份进行了通常的包构建,并添加了指定Python 可执行文件mod_wsgi 应该编译的步骤:

   $ ./configure --with-python=/opt/python3.4/bin/python3.4
   $ make
   $ make install

之后,我配置了以下文件:

4./etc/apache2/httpd.conf

LoadModule dir_module   /usr/lib/apache2/modules/mod_dir.so
LoadModule env_module   /usr/lib/apache2/modules/mod_env.so
LoadModule mime_module  /usr/lib/apache2/modules/mod_mime.so
LoadModule wsgi_module  /usr/lib/apache2/modules/mod_wsgi.so

ServerName localhost
WSGIPythonHome /location/of/virtualenv's/bin
WSGIRestrictEmbedded On
WSGILazyInitialization On

(上面那个mod_wsgi应该是上一条命令中已经建好的。)

5./etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    Alias /media /var/www/django_media/
    Alias /static /var/www/django_static/

    <Directory /var/www/django_media>
        Options FollowSymLinks
        AllowOverride None
        Order Deny,Allow
        Allow from all
    </Directory>
    <Directory /var/www/django_static>
        Options FollowSymLinks
        AllowOverride None
        Order Deny,Allow
        Allow from all
    </Directory>

    WSGIApplicationGroup %{GLOBAL}
    KeepAlive Off
    WSGIDaemonProcess site-name.com processes=2 threads=6 python-path=/var/www/location/env/lib/python3.4/site-packages:/var/www/location/env/bin:/var/www/location/location
    WSGIProcessGroup site-name.com
    WSGIScriptAlias / /var/www/location/location/location/wsgi.py

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

    LogLevel info
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    CustomLog log/location.log combined
    ErrorLog log/error/location.log
</VirtualHost>

6.最后,我为上面的默认创建了一个符号链接:

$ ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default

当您试图找出您的 Apache 版本未使用正确 Python 的原因时,这可能很有用?就个人而言,我猜mod_wsgi 是罪魁祸首。

【讨论】:

    【解决方案2】:

    要将 python 3 解释器与 django 一起使用,请使用以下步骤:

    1) check python 3 path in your system by using -> which python3
    output will be like this  ->  /usr/bin/python3
    2) then create a virtual environment-> virtualenv -p /usr/bin/python3 project
    it will create a virtual environment name as project
    3)to activate it run- > . project/bin/activate
    

    【讨论】:

      【解决方案3】:

      我按照@GrahamDumpleton 的评论让它工作了。

      您不需要重建 mod_wsgi,因为 py3 包可用。这是我所做的:

      • 删除 mod_wsgi 包和依赖项:

        sudo apt-get remove libapache2-mod-wsgi
        sudo apt-get autoremove
        
      • 为 python 3 安装 mod_wsgi:

        sudo apt-get install libapache2-mod-wsgi-py3
        
      • 这是我的 apache 配置:/etc/apache2/sites-available/000-default.conf

        <VirtualHost *:80>
        WSGIDaemonProcess irmaweb python-path=/var/www/irmaweb/irmaweb:/var/www/irmaweb/env/lib/python3.4/site-packages
        WSGIProcessGroup irmaweb
        WSGIScriptAlias / /var/www/irmaweb/irmaweb/irmaweb/wsgi.py
        Alias /site_media/static/ /var/www/irmaweb/irmaweb/irmaweb/site_media/static/  
        ...
        
      • 然后,重启 apache:

        sudo service apache2 restart
        

      我还在settings.py中添加了指定db文件的完整路径,并对其进行了chmod 664。

      【讨论】: