在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
当然,这会覆盖整个文件,所以请注意以防万一你碰巧有更多的指令。