在Ubuntu 14.04上使用Apache2和libapache2-mod-wsgi-py3的AssertionError(Python 3.4)

在Ubuntu 14.04上,使用安装了libapache2-mod-wsgi-py3软件包的Apache2会在/var/log/apache2/error.log中出错

重现的方式很简单:

sudo apt-get install apache2 sudo service apache2 restart # /var/log/apache2/error.log is "clean" sudo apt-get install libapache2-mod-wsgi-py3 sudo service apache2 restart 

/var/log/apache2/error.log给出以下错误:

 [Mon Jan 05 16:51:53.641332 2015] [:error] [pid 3141:tid 140703516379008] Exception ignored in:  [Mon Jan 05 16:51:53.643563 2015] [:error] [pid 3141:tid 140703516379008] Traceback (most recent call last): [Mon Jan 05 16:51:53.643633 2015] [:error] [pid 3141:tid 140703516379008] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown [Mon Jan 05 16:51:53.644350 2015] [:error] [pid 3141:tid 140703516379008] assert tlock is not None [Mon Jan 05 16:51:53.643449 2015] [:error] [pid 3140:tid 140703516379008] Exception ignored in:  [Mon Jan 05 16:51:53.644456 2015] [:error] [pid 3140:tid 140703516379008] Traceback (most recent call last): [Mon Jan 05 16:51:53.644514 2015] [:error] [pid 3140:tid 140703516379008] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown [Mon Jan 05 16:51:53.645052 2015] [:error] [pid 3140:tid 140703516379008] assert tlock is not None [Mon Jan 05 16:51:53.645119 2015] [:error] [pid 3141:tid 140703516379008] AssertionError: [Mon Jan 05 16:51:53.647513 2015] [:error] [pid 3140:tid 140703516379008] AssertionError: 

如何让它无误地工作?

Ubuntu 14.04附带mod_wsgi 3.4。 根据https://code.djangoproject.com/ticket/22948#comment:2,我们需要在Python 3.4中使用mod_wsgi版本4.2+。

将mod_wsgi安装到最新版本的最佳方法是使用pip(可以在virtualenv中)获取它,然后将其模块安装到系统范围的apache。 在我的例子中,我使用/venv_path设置的virtualenv。

1)删除有问题的包并安装依赖项

 sudo apt-get remove libapache2-mod-wsgi-py3 sudo apt-get install apache2-dev 

2)使用pip在virtualenv中安装mod_wsgi

 . /venv_path/bin/activate pip install mod_wsgi 

3)安装到Apache(系统范围)

 sudo /venv_path/bin/mod_wsgi-express install-module sudo vi /etc/apache2/mods-available/wsgi_express.load /etc/apache2/mods-available/wsgi_express.conf 

/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_express.conf内容

 WSGIPythonHome /venv_path 

4)启用模块并重启Apache。

 sudo a2enmod wsgi_express sudo service apache2 restart 

5)检查/var/log/apache2/error.log是否存在错误

只想在samb提供的接受答案中添加一些内容。

您需要添加到模块配置的实际配置行是mod_wsgi-express install-module命令输出的配置(在接受的答案中未明确)。

另外,在我的情况下(并根据mod_wsgi pkg文档 – 可能在写入接受的答案时不是这种情况)我没有在mods-available获得任何wsgi_express.*文件,但只有wsgi.* ,和通过运行用新配置替换wsgi.load文件就足够了

 mod_wsgi-express install-module > /etc/apache2/mods-available/wsgi.load 

当然,这会覆盖整个文件,所以请注意以防万一你碰巧有更多的指令。