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), а потім встановити його модуль на апаш-систему. У моєму випадку я використовую встановлений virtualenv /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. Я використовував 64-розрядний Python 3.5. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Якщо ви не знаєте, яка у вас версія, перейдіть до папки ( /usr/lib/apache2/modules/) і подивіться. Здається, ця відповідь базується на 32-бітному пітоні 3.4.
Deleet

цей метод є python-version-agnostic і для мене працював з python3.6 sudo /venv_path/bin/mod_wsgi-express install-moduleна кроці 3 надрукує шляхи, які потрібно помістити у wsgi_expressфайли
gevra

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

Звичайно, це перезаписає весь файл, тому будьте уважні, якщо у вас є якісь директиви в ньому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.