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

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

在 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: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[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: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[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: 

如何让它无错误地运行?

答案1

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 系统范围。在我的例子中,我使用 中的 virtualenv 设置/venv_path

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

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

2)使用 pip 在 vi​​rtualenv 中安装 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

答案2

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

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

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

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

当然,这会覆盖整个文件,所以如果其中还有更多指令,请小心。

相关内容