web-dev-qa-db-fra.com

AssertionError utilisant Apache2 et libapache2-mod-wsgi-py3 sur Ubuntu 14.04 (Python 3.4)

Sous Ubuntu 14.04, utiliser Apache2 avec le paquetage libapache2-mod-wsgi-py3 installé provoque des erreurs dans /var/log/Apache2/error.log.

La façon de reproduire est simple:

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 donne l'erreur suivante:

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

Comment le faire fonctionner sans erreur?

10
samb

Ubuntu 14.04 est fourni avec mod_wsgi 3.4. Selon https://code.djangoproject.com/ticket/22948#comment:2 nous devons utiliser la version 4.2 de mod_wsgi pour Python 3.4.

Le meilleur moyen d'installer mod_wsgi dans la version la plus récente est de l'obtenir avec pip (peut être dans virtualenv), puis d'installer son module sur le système Apache. Dans mon cas, j'utilise virtualenv défini dans /venv_path.

1) Supprimer le paquet problématique et installer la dépendance

Sudo apt-get remove libapache2-mod-wsgi-py3
Sudo apt-get install Apache2-dev

2) Installer mod_wsgi dans virtualenv avec pip

. /venv_path/bin/activate
pip install mod_wsgi

3) Installer dans Apache (à l'échelle du système)

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

Contenu de /etc/Apache2/mods-available/wsgi_express.load

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

Contenu de /etc/Apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Activez le module et redémarrez Apache.

Sudo a2enmod wsgi_express
Sudo service Apache2 restart

5) Vérifiez qu'il n'y a pas d'erreur dans /var/log/Apache2/error.log

15
samb

Je voulais juste ajouter quelque chose à la réponse acceptée fournie par samb.

Les lignes de configuration que vous devez ajouter à la configuration du module sont celles générées par la commande mod_wsgi-express install-module (ceci n'était pas explicite dans la réponse acceptée).

En outre, dans mon cas (et selon le documentation de mod_wsgi pkg - ce n'était probablement pas le cas lorsque la réponse acceptée a été écrite), je n'ai reçu aucun fichier wsgi_express.* dans mods-available, mais seulement wsgi.*, et il suffisait de remplacer le fichier wsgi.load par la nouvelle configuration en exécutant

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

Bien sûr, cela écraserait tout le fichier, alors faites attention au cas où vous auriez plus de directives.

0
praimmugen