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


10

在Ubuntu 14.04上,将Apache2与安装的软件包libapache2-mod-wsgi-py3一起使用会在/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: 

如何使它正常工作?

Answers:


15

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 set /venv_path

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


1
您可能要提到的是virtualenv -p python3.4 DIRECTORY,创建virtualenv的命令更好,或者对于3.4+,更好pyvenv-3.4 DIRECTORY
nyuszika7h 2015年

1
没错...但是我没有提到它来专注于mod_wsgi问题。
2015年

1
但是,由于您已经在示例中使用了virtualenv,为什么不还要提及如何创建它呢?
nyuszika7h 2015年

如果其他人cannot open shared object file: No such file or directory在尝试执行此操作时遇到错误(),请记住在步骤3中切换版本。我使用的是Python 3.5(64位)。mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so。如果您不知道哪个版本,请转到文件夹(/usr/lib/apache2/modules/)进行查找。这个答案似乎基于32位python 3.4。
Deleet '16

此方法与python-version-agnostic无关,并且sudo /venv_path/bin/mod_wsgi-express install-module在步骤3中为python3.6所用,将打印您需要在wsgi_express文件中放置的路径
gevra

0

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

您需要添加到模块config的实际配置行是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

当然,这将覆盖整个文件,因此请当心,如果您碰巧有更多的指令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.