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


10

Sur Ubuntu 14.04, l'utilisation d'Apache2 avec le paquet libapache2-mod-wsgi-py3 installé donne des erreurs dans /var/log/apache2/error.log

La façon de se 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?

Réponses:


15

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.

La meilleure façon d'installer mod_wsgi dans la dernière version est de l'obtenir avec pip (peut être dans virtualenv) puis d'installer son module sur apache à l'échelle du système. Dans mon cas, j'utilise virtualenv set in /venv_path.

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

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

2) Installez 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


1
Vous voudrez peut - être mentionner que la commande pour créer un virtualenv est virtualenv -p python3.4 DIRECTORY, ou pour 3.4+, mieux: pyvenv-3.4 DIRECTORY.
nyuszika7h

1
C'est vrai ... mais je ne l'ai pas mentionné pour garder l'accent sur la question mod_wsgi.
samb

1
Mais comme vous utilisez déjà virtualenv dans votre exemple, pourquoi ne pas mentionner également comment le créer?
nyuszika7h

Si quelqu'un d'autre obtient une erreur ( cannot open shared object file: No such file or directory) en essayant de le faire, n'oubliez pas de changer de version à l'étape 3. J'utilisais Python 3.5, 64 bits. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Si vous ne savez pas de quelle version vous disposez, allez dans le dossier ( /usr/lib/apache2/modules/) et regardez. Cette réponse semble être basée sur python 32 bits 3.4.
Deleet

cette méthode est indépendante de la version de python et a fonctionné pour moi avec python3.6 sudo /venv_path/bin/mod_wsgi-express install-moduleà l'étape 3 imprimera les chemins que vous devez mettre dans les wsgi_expressfichiers
gevra

0

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

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

De plus, dans mon cas (et selon la documentation du module mod_wsgi - ce n'était probablement pas le cas lorsque la réponse acceptée a été écrite), je n'ai pas entré de wsgi_express.*fichiers mods-available, mais seulement wsgi.*, et il suffisait de remplacer le wsgi.loadfichier par le 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 dedans.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.