如何使用带有 mod_wsgi 的 conda 环境?

How do I use a conda environment with mod_wsgi?

我的第一个 post,我是 Python 和 Apache 的新手,所以请放轻松。我在 conda 环境中有一个 Python Web 应用程序,使用 Flask 可以很好地提供内容。现在我需要使用 Apache 而不是 Flask 来提供所有服务。我可以使用 mod_wsgi 让 Apache 达到 运行 Python,但只能使用 virtualenv。我尝试使用 Anaconda 安装 virtualenv,但我收到一条警告,指出此类设置不受支持且不推荐。所以我的问题是:

如何在 conda 环境中设置 Apache 运行 我的应用程序?

Here,有一个关于使用虚拟环境的部分,它说我需要在我的 wsgi 文件中输入一行来显示在哪里可以找到 activate_this.py。 virtualenv虚拟环境有activate_this.py,conda环境没有。似乎没有激活虚拟环境的正确说明,我只是在我的浏览器中收到错误 500,在我的 httpd error_log.

中收到 "Import error: no module named flask"

这在我的 httpd.conf 文件中:

<VirtualHost *:80>
     DocumentRoot /var/www
     WSGIScriptAlias / var/www/tsm.wsgi
     <Directory /var/www/tsm>
     Order allow,deny
     Allow from all
     </Directory>
</VirtualHost>

这里是 tsm.wsgi:

import sys
import site
site.addsitedir('~/.conda/envs/tsm/lib/python2.7/site-packages')
sys.path.insert(0, '/var/www/tsm/server/time_series_machine')
sys.stdout = sys.stderr
from app import app as application

有什么想法吗?感谢您提供的任何帮助。

您的 mod_wsgi 需要针对 Anaconda Python 进行编译,而不是您的系统 Python。换句话说,您不能使用系统提供的 mod_wsgi 包,而需要自己编译。然后按照它说的去做:

即使用daemon模式,使用python-home选项WSGIDaemonProcess

请注意,有报告称 Anaconda Python 在某些方面出现问题,无法与想要嵌入 Python 的系统一起使用。所以可能无论如何都行不通。

顺便说一句,无论如何,您不能按照您的方式在 WSGI 脚本文件的路径中使用“~”。它不会扩展为主目录。但是,遵循那个 post,你就不需要那个了。

我迟到了,但我遇到了同样的问题。对于它的价值,我不需要重新编译任何东西,并且能够通过使用系统安装的 mod_wsgi:

在我的 VirtualHost 配置中包含这样的东西来让它工作
WSGIDaemonProcess mysite python-path=/path/to/anaconda2/lib/python2.7/site-packages

请注意,这指向 site-packages 目录。

要添加到@dino 的答案中,您还可以将 mod_wsgi 安装到根 conda 环境中:

# Instal `mod_wsgi`
$ pip install mod_wsgi

# Find the full path to installed `mod_wsgi`
$ which mod_wsgi-express

# Install and register the `mod_wsgi` module with Apache
$ sudo /full/path/to/installed/mod_wsgi-express install-module

然后您可以为多个站点创建 conda 环境:

# Create 3 conda environments
conda create -n mysite1 python django
conda create -n mysite2 python django
conda create -n mysite3 python django

并在 Apache 站点配置文件中设置 WSGIDaemonProcess 以便为每个站点使用合适的环境:

# /etc/apache2/sites-enabled/mysite1.conf
WSGIDaemonProcess mysite1 python-path=/path/to/anaconda3/envs/mysite1/lib/python3.5/site-packages

# /etc/apache2/sites-enabled/mysite2.conf
WSGIDaemonProcess mysite2 python-path=/path/to/anaconda3/envs/mysite2/lib/python3.5/site-packages

# /etc/apache2/sites-enabled/mysite3.conf
WSGIDaemonProcess mysite3 python-path=/path/to/anaconda3/envs/mysite3/lib/python3.5/site-packages