在Ubuntu上为Python3安装mod_wsgi

时间:2015-06-05 19:49:25

标签: ubuntu python-3.x pip virtualenv mod-wsgi

有人能给我一套明确的说明,在Ubuntu for Python 3上安装mod_wsgi吗?

我确实得到了Flask& mod_wsgi成功使用了Python3,并且在短时间内感到高兴。

...直到我查看Apache的日志并意识到我遇到了这个问题:https://askubuntu.com/questions/569550/assertionerror-using-apache2-and-libapache2-mod-wsgi-py3-on-ubuntu-14-04-python

apt-get正在安装libapache2-mod-wsgi-py3的过时版本,这会导致Apache日志中出错。 (我应该报告这个,如果是这样的话吗?)

在链接中,工程师正在使用pip安装更新版本。

有趣的是,他似乎将其安装到虚拟Python3环境中。 (这与使用系统pip3有什么不同?)

他也使用pip3 install mod_wsgi,但pip3 search mod_wsgi返回:

(编辑:不,他没有,他使用pip而不是pip3。这可能是对的吗?他的电线是否交叉?是不是要忽略他在他的py3venv中的事实使用系统的py2安装?但无论如何不能解决混淆......)

mod_wsgi-metrics          - Metrics package for Apache/mod_wsgi.
cykooz.recipe.pastewsgi   - Buildout recipe to create paste.deploy entry points for mod_wsgi or uwsgi
mod_wsgi-httpd            - Installer for Apache httpd web server.
apachemiddleware          - Useful Python middleware for use with mod_wsgi deployments
tranchitella.recipe.wsgi  - Buildout recipe to create paste.deploy entry points for mod_wsgi
mod_wsgi                  - Installer for Apache/mod_wsgi.

那么mod_wsgi-httpd是什么?是否确定这不是我想要的那个?

最后,任何人都可以提供从源代码安装mod_wsgi的链接吗?

编辑:我不明白工程师使用pip install mod_wsgi而不是pip3 ...的原因。当然那不可能是对的吗?但如果我使用pip3,我会得到:

pi@PiDroplet:~$ cd web/piFlask

pi@PiDroplet:~/web/piFlask$ source ./venv3/bin/activate
(venv3)
pi@PiDroplet:~/web/piFlask$ pip3 install mod_wsgi
Downloading/unpacking mod-wsgi
  Downloading mod_wsgi-4.4.12.tar.gz (991kB): 991kB downloaded
  Running setup.py (path:/home/pi/web/piFlask/venv3/build/mod-wsgi/setup.py) egg_info for package mod-wsgi
    Traceback (most recent call last):
      File "<string>", line 17, in <module>
      File "/home/pi/web/piFlask/venv3/build/mod-wsgi/setup.py", line 141, in <module>
        'missing Apache httpd server packages.' % APXS)
    RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):

  File "<string>", line 17, in <module>

  File "/home/pi/web/piFlask/venv3/build/mod-wsgi/setup.py", line 141, in <module>

    'missing Apache httpd server packages.' % APXS)

RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.

----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /home/pi/web/piFlask/venv3/build/mod-wsgi
Storing debug log for failure in /home/pi/.pip/pip.log

现在我尝试pip3 install mod_wsgi-httpd,编译需要大约五分钟:

(venv3)
pi@PiDroplet:~/web/piFlask$ pip3 install mod_wsgi-httpd
Downloading/unpacking mod-wsgi-httpd
  Downloading mod_wsgi-httpd-2.4.12.5.tar.gz
  Running setup.py (path:/home/pi/web/piFlask/venv3/build/mod-wsgi-httpd/setup.py) egg_info for package mod-wsgi-httpd
    apr-1.5.2/
    apr-1.5.2/config.layout
    apr-1.5.2/build.conf
    apr-1.5.2/emacs-mode
    :

所以现在我担心我的Py3 virtualenv中有第二个Apache。

然而,这确实摆脱了错误; pip3 install mod_wsgi现已成功完成。

编辑:但是现在我完全忘记了试图遵循他的指示:我没有/etc/apache2/mods-available/wsgi_express.load,如果他建议制作它,那么一开始这似乎是随意的,其次是文本他建议加入它,即LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so - 我的系统上不存在这个文件。

我确实有/etc/apache2/mods-available/wsgi.load

再次淹没技术,有人可以给我一条线吗?

2 个答案:

答案 0 :(得分:23)

我打算将这个答案作为“对他人可能有用的自我说明”。

在撰写本文时,

apt-get会安装mod_wsgi的过时版本。

pip安装最新版本。它通过下载源代码并进行编译来实现。

设置Python3 virtualenv并使用source ./venv3/bin/activate激活它,验证which pip确认它现在正在使用此环境。看来pip和pip3是可以互换的。

在我的情况下,我的./venv3位于我的烧瓶文件夹中。 mod_wsgi的唯一目的是让Apache路由http://myfoo.org/flask向我的烧瓶应用程序发出请求。因此,将mod_wsgi安装到此venv3

是有意义的

但是,要使pip成功编译它,我首先需要sudo apt-get install apache2-dev,它提供必要的头文件。然后我需要重启。然后pip install mod_wsgi就可以了。

然后按照原始链接的说明进行操作:

(venv3)
$ sudo venv3/bin/mod_wsgi-express install-module
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so
WSGIPythonHome /home/pi/web/piFlask/venv3

然后我必须分别创建包含这两行的/etc/apache2/mods-available/wsgi_express.{load,conf}

最后启用模块并检查Apache的错误日志:

a2enmod wsgi
sudo service apache2 restart
cat /var/log/apache2/error.log

答案 1 :(得分:5)

如果他们已经激活了Python 3虚拟环境并且其bin目录位于路径中,那么他们可能只需运行&#39; pip&#39;而不是&#39; pip3&#39;。你应该运行&#39;哪个pip&#39;验证它是否来自您期望的虚拟环境。

&#39; mod_wsgi-httpd&#39; package专门用于安装Apache本身的独特实例,以解决系统范围Apache过时或缺少开发头文件的问题,或者无法修改系统范围的配置。当您没有root权限来修复系统范围的问题并且只对在非特权端口上运行感兴趣并因此不需要root访问权限时,它通常更具相关性。您还必须使用&#39; mod_wsgi-express&#39;来自&#39; mod_wsgi&#39;包裹是&#39; pip&#39;安装在&#39; mod_wsgi-httpd&#39;之后已安装,因为这是使用&#39; mod_wsgi-httpd&#39;的唯一方法。已安装的Apache版本。

因此,对于&#39; mod_wsgi-httpd&#39;你真的想忽略它。如果你已经安装了它,那么&#39; pip&#39;卸载它和&#39; mod_wsgi&#39;。后者需要卸载,因为它将绑定到&#39; mod_wsgi-httpd&#39; Apache版本和&#39; mod_wsgi.so&#39;不适用于整个系统。

至于在链接中分隔用户步骤,它们看起来是正确的,虽然我会说在第3步中,应该突出显示要添加的LoadModuleWSGIPythonHome行是当输出时运行mod_wsgi-express install-module命令。什么是输出是自定义的,以匹配您的安装应该是什么。因此,不要使用该命令输出来组成值。

如果您还有wsgi.load个文件,请运行sudo a2dismod wsgi以删除它或以其他方式手动删除它。它是旧系统打包的mod_wsgi的遗留物。