AssertionError usando Apache2 e libapache2-mod-wsgi-py3 su Ubuntu 14.04 (Python 3.4)


10

Su Ubuntu 14.04, l'uso di Apache2 con il pacchetto libapache2-mod-wsgi-py3 installato genera errori in /var/log/apache2/error.log

Il modo di riprodurre è semplice:

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 dà il seguente errore:

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

Come farlo funzionare senza errori?

Risposte:


15

Ubuntu 14.04 viene fornito con mod_wsgi 3.4. Secondo https://code.djangoproject.com/ticket/22948#comment:2 dobbiamo usare mod_wsgi versione 4.2+ per Python 3.4.

Il modo migliore per installare mod_wsgi all'ultima versione è ottenerlo con pip (può essere in virtualenv) e quindi installare il suo modulo su apache a livello di sistema. Nel mio caso uso virtualenv set in /venv_path.

1) Rimuovere il pacchetto problematico e installare la dipendenza

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

2) Installa mod_wsgi in virtualenv con pip

. /venv_path/bin/activate
pip install mod_wsgi

3) Installa in Apache (a livello di 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

Il contenuto di /etc/apache2/mods-available/wsgi_express.load

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

Il contenuto di /etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Abilita il modulo e riavvia Apache.

sudo a2enmod wsgi_express
sudo service apache2 restart

5) Verificare che non vi siano errori in /var/log/apache2/error.log


1
Si consiglia di dire che il comando per creare un virtualenv è virtualenv -p python3.4 DIRECTORY, o per 3.4+, meglio: pyvenv-3.4 DIRECTORY.
nyuszika7h,

1
È corretto ... ma non ne ho parlato per mantenere l'attenzione sulla domanda mod_wsgi.
Samb

1
Ma dal momento che stai già usando virtualenv nel tuo esempio, perché non menzionare anche come crearlo?
nyuszika7h

Se qualcun altro riceve un errore ( cannot open shared object file: No such file or directory) quando tenta di farlo, ricordati di cambiare la versione al passaggio 3. Stavo usando Python 3.5, 64-bit. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Se non sai quale versione hai, vai alla cartella ( /usr/lib/apache2/modules/) e guarda. Questa risposta sembra essere basata su Python 3.4 a 32 bit.
Deleet,

questo metodo è python-version-agnostic e ha funzionato per me con python3.6 sudo /venv_path/bin/mod_wsgi-express install-modulenel passaggio 3 stamperà i percorsi che devi inserire nei wsgi_expressfile
gevra,

0

Volevo solo aggiungere qualcosa alla risposta accettata fornita da samb.

Le linee di configurazione effettive che è necessario aggiungere alla configurazione del modulo sono quelle emesse dal mod_wsgi-express install-modulecomando (ciò non era esplicito nella risposta accettata).

Inoltre, nel mio caso (e secondo la documentazione di mod_wsgi pkg - probabilmente non è stato così quando è stata scritta la risposta accettata) Non ho ricevuto alcun wsgi_express.*file mods-available, ma solo wsgi.*ed è stato sufficiente sostituire il wsgi.loadfile con il nuova configurazione eseguendo

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

Naturalmente, questo sovrascriverebbe l'intero file, quindi fai attenzione nel caso in cui tu abbia altre direttive in esso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.