AssertionError usando Apache2 y libapache2-mod-wsgi-py3 en Ubuntu 14.04 (Python 3.4)

10

En Ubuntu 14.04, el uso de Apache2 con el paquete libapache2-mod-wsgi-py3 instalado produce errores en /var/log/apache2/error.log

La forma de reproducirse es sencilla:

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 da el siguiente error:

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

¿Cómo hacer que funcione sin errores?

samb
fuente

Respuestas:

15

Ubuntu 14.04 viene con mod_wsgi 3.4. De acuerdo con https://code.djangoproject.com/ticket/22948#comment:2 necesitamos usar mod_wsgi versión 4.2+ para Python 3.4.

La mejor manera de instalar mod_wsgi en la última versión es obtenerlo con pip (puede estar en virtualenv) y luego instalar su módulo en apache en todo el sistema. En mi caso utilizo virtualenv establecido en /venv_path.

1) Eliminar el paquete problemático e instalar la dependencia

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

2) Instalar mod_wsgi en virtualenv con pip

. /venv_path/bin/activate
pip install mod_wsgi

3) Instalar en Apache (en todo el sistema)

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

Contenido de /etc/apache2/mods-available/wsgi_express.load

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

Contenido de /etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Habilite el módulo y reinicie Apache.

sudo a2enmod wsgi_express
sudo service apache2 restart

5) Verifique que no haya errores en /var/log/apache2/error.log

samb
fuente
1
Es posible que desee hablar de que el comando para crear un virtualenv es virtualenv -p python3.4 DIRECTORY, o por 3.4+, mejor: pyvenv-3.4 DIRECTORY.
nyuszika7h
1
Eso es correcto ... pero no lo mencioné para mantener el foco en la pregunta mod_wsgi.
samb
1
Pero como ya está usando virtualenv en su ejemplo, ¿por qué no mencionar también cómo crearlo?
nyuszika7h
Si alguien obtiene un error ( cannot open shared object file: No such file or directory) cuando intenta hacer esto, recuerde cambiar la versión en el paso 3. Estaba usando Python 3.5, 64 bits. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Si no sabe qué versión tiene, vaya a la carpeta ( /usr/lib/apache2/modules/) y busque. Esta respuesta parece estar basada en Python 3.4 de 32 bits.
Deleet
este método es python-versión-agnóstica y trabajado para mí con python3.6 sudo /venv_path/bin/mod_wsgi-express install-moduleen el paso 3 se imprimirán los caminos que hay que poner en el wsgi_expressarchivos
gevra
0

Solo quería agregar algo a la respuesta aceptada proporcionada por samb.

Las líneas reales de configuración que necesita agregar a la configuración del módulo son las que genera el mod_wsgi-express install-modulecomando (esto no fue explícito en la respuesta aceptada).

Además, en mi caso (y de acuerdo con la documentación del paquete mod_wsgi - probablemente este no fue el caso cuando se escribió la respuesta aceptada) no recibí ningún wsgi_express.*archivo mods-available, pero solo wsgi.*, y fue suficiente para reemplazar el wsgi.loadarchivo con el nueva configuración ejecutando

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

Por supuesto, esto sobrescribiría todo el archivo, así que tenga cuidado en caso de que tenga más directivas.

praimmugen
fuente