Erro de asserção usando Apache2 e libapache2-mod-wsgi-py3 no Ubuntu 14.04 (Python 3.4)

10

No Ubuntu 14.04, o uso do Apache2 com o pacote libapache2-mod-wsgi-py3 instalado gera erros no /var/log/apache2/error.log

A maneira de reproduzir é simples:

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 fornece o seguinte erro:

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

Como fazê-lo funcionar sem erros?

samb
fonte

Respostas:

15

O Ubuntu 14.04 vem com o mod_wsgi 3.4. De acordo com https://code.djangoproject.com/ticket/22948#comment:2 , precisamos usar o mod_wsgi versão 4.2+ para o Python 3.4.

A melhor maneira de instalar o mod_wsgi na versão mais recente é obtê-lo com o pip (pode estar no virtualenv) e, em seguida, instalar seu módulo no apache em todo o sistema. No meu caso, eu uso o virtualenv set in /venv_path.

1) Remova o pacote problemático e instale a dependência

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

2) Instale mod_wsgi no virtualenv com pip

. /venv_path/bin/activate
pip install mod_wsgi

3) Instale no Apache (em todo o 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

Conteúdo de /etc/apache2/mods-available/wsgi_express.load

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

Conteúdo de /etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Habilite o módulo e reinicie o Apache.

sudo a2enmod wsgi_express
sudo service apache2 restart

5) Verifique se não há erros no /var/log/apache2/error.log

samb
fonte
1
Você pode querer mencionar que o comando para criar um virtualenv é virtualenv -p python3.4 DIRECTORY, ou para 3.4+, melhor: pyvenv-3.4 DIRECTORY.
usar o seguinte código
1
Está correto ... mas eu não mencionei isso para manter o foco na questão mod_wsgi.
samb
1
Mas como você já está usando o virtualenv no seu exemplo, por que não mencionar também como criá-lo?
usar o seguinte código
Se outra pessoa receber um erro ( cannot open shared object file: No such file or directory) ao tentar fazer isso, lembre-se de mudar a versão na etapa 3. Eu estava usando o Python 3.5 de 64 bits. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Se você não souber qual versão possui, vá para a pasta ( /usr/lib/apache2/modules/) e veja. Essa resposta parece basear-se no python 3.4 de 32 bits.
Deleet 15/10/16
este método é-python-versão agnóstico e funcionou para mim com python3.6 sudo /venv_path/bin/mod_wsgi-express install-moduleno passo 3 irá imprimir os caminhos que você precisa colocar na wsgi_expressarquivos
gevra
0

Só queria adicionar algo à resposta aceita fornecida pelo samb.

As linhas reais de configuração que você precisa adicionar à configuração do módulo são as produzidas pelo mod_wsgi-express install-modulecomando (isso não foi explícito na resposta aceita).

Além disso, no meu caso (e de acordo com a documentação do mod_wsgi pkg - provavelmente não foi o caso quando a resposta aceita foi escrita) eu não recebi nenhum wsgi_express.*arquivo mods-available, apenas wsgi.*, e foi suficiente para substituir o wsgi.loadarquivo pelo nova configuração executando

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

Obviamente, isso sobrescreveria o arquivo inteiro; portanto, tenha cuidado se houver mais diretivas nele.

praimmugen
fonte