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?

samb
la source

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

samb
la source
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.

praimmugen
la source