AssertionError с использованием Apache2 и libapache2-mod-wsgi-py3 в Ubuntu 14.04 (Python 3.4)

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: 

Как заставить его работать без ошибок?

Самба
источник

Ответы:

15

Ubuntu 14.04 поставляется с mod_wsgi 3.4. Согласно https://code.djangoproject.com/ticket/22948#comment:2 нам нужно использовать mod_wsgi версии 4.2+ для Python 3.4.

Лучший способ установить mod_wsgi на последнюю версию - это получить его с помощью pip (может быть в virtualenv), а затем установить его модуль в apache для всей системы. В моем случае я использую virtualenv set in /venv_path.

1) Удалить проблемный пакет и установить зависимость

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

2) Установите mod_wsgi в virtualenv с помощью pip

. /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 является virtualenv -p python3.4 DIRECTORY, или 3.4+, лучше: pyvenv-3.4 DIRECTORY.
nyuszika7h
1
Это правильно ... но я не упомянул это, чтобы сосредоточиться на вопросе mod_wsgi.
Самб
1
Но так как вы уже используете virtualenv в своем примере, почему бы не упомянуть, как его создать?
nyuszika7h
Если кто-то еще получает ошибку ( 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-битном питоне 3.4.
Deleet
этот метод не зависит от версии Python и работал для меня с python3.6 sudo /venv_path/bin/mod_wsgi-express install-moduleна шаге 3, который напечатает пути, которые вам нужно wsgi_express
указать
0

Просто хотел добавить что-то к принятому ответу, предоставленному 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

Конечно, это перезапишет весь файл, так что будьте осторожны, если у вас появятся какие-либо дополнительные директивы.

praimmugen
источник