Błąd Asercji przy użyciu Apache2 i libapache2-mod-wsgi-py3 na Ubuntu 14.04 (Python 3.4)

10

Na Ubuntu 14.04 użycie Apache2 z zainstalowanym pakietem libapache2-mod-wsgi-py3 powoduje błędy w /var/log/apache2/error.log

Sposób reprodukcji jest prosty:

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 daje następujący błąd:

[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: 

Jak to działa bezbłędnie?

samb
źródło

Odpowiedzi:

15

Ubuntu 14.04 zawiera mod_wsgi 3.4. Zgodnie z https://code.djangoproject.com/ticket/22948#comment:2 musimy używać mod_wsgi w wersji 4.2+ dla Pythona 3.4.

Najlepszym sposobem na zainstalowanie mod_wsgi do najnowszej wersji jest pobranie go za pomocą pip (może być w virtualenv), a następnie zainstalowanie jego modułu do apache w całym systemie. W moim przypadku używam virtualenv ustawionego w /venv_path.

1) Usuń problematyczny pakiet i zainstaluj zależność

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

2) Zainstaluj mod_wsgi w virtualenv z pip

. /venv_path/bin/activate
pip install mod_wsgi

3) Zainstaluj w Apache (w całym systemie)

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

Zadowolony z /etc/apache2/mods-available/wsgi_express.load

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so

Zadowolony z /etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Włącz moduł i zrestartuj Apache.

sudo a2enmod wsgi_express
sudo service apache2 restart

5) Sprawdź, czy nie ma żadnych błędów /var/log/apache2/error.log

samb
źródło
1
Może warto wspomnieć, że polecenie, aby utworzyć virtualenv jest virtualenv -p python3.4 DIRECTORYalbo za 3.4+, lepiej: pyvenv-3.4 DIRECTORY.
nyuszika7h
1
Zgadza się ... ale nie wspomniałem o tym, aby skupić się na pytaniu mod_wsgi.
samb
1
Ale skoro już używasz virtualenv w swoim przykładzie, dlaczego nie wspomnieć o tym, jak go utworzyć?
nyuszika7h
Jeśli ktoś inny otrzyma błąd ( cannot open shared object file: No such file or directory) podczas próby wykonania tej czynności, pamiętaj o zmianie wersji w kroku 3. Korzystałem z 64-bitowego języka Python 3.5. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Jeśli nie wiesz, którą wersję posiadasz, przejdź do folderu ( /usr/lib/apache2/modules/) i poszukaj. Ta odpowiedź wydaje się opierać na 32-bitowym pythonie 3.4.
Deleet
ta metoda jest python-wersja-agnostyczna i działała dla mnie z python3.6 sudo /venv_path/bin/mod_wsgi-express install-modulew kroku 3 wydrukuje ścieżki, które musisz umieścić w wsgi_expressplikach
gevra
0

Chciałem tylko dodać coś do zaakceptowanej odpowiedzi dostarczonej przez samb.

Rzeczywiste wiersze config, które należy dodać do konfiguracji modułu, to wiersze wypisane przez mod_wsgi-express install-modulepolecenie (nie było to jednoznaczne w zaakceptowanej odpowiedzi).

Również w moim przypadku (i zgodnie z dokumentacją mod_wsgi pkg - prawdopodobnie nie było tak, gdy została napisana zaakceptowana odpowiedź) nie dostałem żadnych wsgi_express.*plików mods-available, ale tylko wsgi.*i wystarczyło zastąpić wsgi.loadplik nowa konfiguracja przez uruchomienie

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

Oczywiście zastąpiłoby to cały plik, więc uważaj na wypadek, gdybyś miał w nim więcej dyrektyw.

praimmugen
źródło