AssertionError mit Apache2 und libapache2-mod-wsgi-py3 unter Ubuntu 14.04 (Python 3.4)

10

Unter Ubuntu 14.04 führt die Verwendung von Apache2 mit installiertem Paket libapache2-mod-wsgi-py3 zu Fehlern in /var/log/apache2/error.log

Die Reproduktion ist unkompliziert:

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 gibt den folgenden Fehler aus:

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

Wie funktioniert es fehlerfrei?

samb
quelle

Antworten:

15

Ubuntu 14.04 wird mit mod_wsgi 3.4 geliefert. Laut https://code.djangoproject.com/ticket/22948#comment:2 müssen wir mod_wsgi Version 4.2+ für Python 3.4 verwenden.

Der beste Weg, um mod_wsgi auf die neueste Version zu installieren, besteht darin, es mit pip (kann in virtualenv sein) abzurufen und dann sein Modul systemweit auf Apache zu installieren. In meinem Fall verwende ich virtualenv set in /venv_path.

1) Entfernen Sie das problematische Paket und installieren Sie die Abhängigkeit

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

2) Installieren Sie mod_wsgi in virtualenv mit pip

. /venv_path/bin/activate
pip install mod_wsgi

3) In Apache installieren (systemweit)

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

Inhalt von /etc/apache2/mods-available/wsgi_express.load

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

Inhalt von /etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Aktivieren Sie das Modul und starten Sie Apache neu.

sudo a2enmod wsgi_express
sudo service apache2 restart

5) Stellen Sie sicher, dass keine Fehler vorliegen /var/log/apache2/error.log

samb
quelle
1
Möglicherweise möchten Sie erwähnen, dass der Befehl zum Erstellen einer virtuellen Umgebung virtualenv -p python3.4 DIRECTORYoder ab 3.4 besser ist : pyvenv-3.4 DIRECTORY.
Nyuszika7h
1
Das ist richtig ... aber ich habe es nicht erwähnt, um den Fokus auf die mod_wsgi-Frage zu richten.
Samb
1
Da Sie in Ihrem Beispiel bereits virtualenv verwenden, können Sie auch erwähnen, wie es erstellt wird.
Nyuszika7h
Wenn jemand anderes cannot open shared object file: No such file or directorybeim Versuch eine Fehlermeldung ( ) erhält , denken Sie daran, die Version in Schritt 3 zu wechseln. Ich habe Python 3.5, 64-Bit verwendet. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Wenn Sie nicht wissen, welche Version Sie haben, gehen Sie zum Ordner ( /usr/lib/apache2/modules/) und suchen Sie. Diese Antwort scheint auf 32-Bit-Python 3.4 zu basieren.
Deleet
Diese Methode ist python-version-agnostisch und hat für mich mit python3.6 sudo /venv_path/bin/mod_wsgi-express install-modulein Schritt 3 gearbeitet. Sie druckt die Pfade, die Sie in die wsgi_expressDateien
einfügen müssen
0

Ich wollte nur etwas zu der akzeptierten Antwort von samb hinzufügen.

Die tatsächlichen Konfigurationszeilen, die Sie zur Modulkonfiguration hinzufügen müssen, werden vom mod_wsgi-express install-moduleBefehl ausgegeben (dies war in der akzeptierten Antwort nicht explizit).

Außerdem habe ich in meinem Fall (und gemäß der Dokumentation zu mod_wsgi pkg - wahrscheinlich war dies nicht der Fall, als die akzeptierte Antwort geschrieben wurde) keine wsgi_express.*Dateien erhalten mods-available, sondern nur wsgi.*, und es war ausreichend, die wsgi.loadDatei durch die zu ersetzen neue Konfiguration durch Ausführen

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

Dies würde natürlich die gesamte Datei überschreiben. Achten Sie also darauf, falls Sie weitere Anweisungen enthalten.

praimmugen
quelle