AssertionError menggunakan Apache2 dan libapache2-mod-wsgi-py3 di Ubuntu 14.04 (Python 3.4)

10

Pada Ubuntu 14.04, menggunakan Apache2 dengan paket libapache2-mod-wsgi-py3 diinstal memberikan kesalahan di /var/log/apache2/error.log

Cara mereproduksi sangat mudah:

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 memberikan kesalahan berikut:

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

Bagaimana cara kerjanya bebas kesalahan?

samb
sumber

Jawaban:

15

Ubuntu 14.04 hadir dengan mod_wsgi 3.4. Menurut https://code.djangoproject.com/ticket/22948#comment .: kita perlu menggunakan mod_wsgi versi 4.2+ untuk Python 3.4.

Cara terbaik untuk menginstal mod_wsgi ke versi terbaru adalah dengan mendapatkannya dengan pip (bisa dalam virtualenv) dan kemudian instal modulnya ke apache seluruh sistem. Dalam kasus saya, saya menggunakan set virtualenv di /venv_path.

1) Hapus paket yang bermasalah dan instal ketergantungan

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

2) Instal mod_wsgi di virtualenv dengan pip

. /venv_path/bin/activate
pip install mod_wsgi

3) Instal ke Apache (seluruh sistem)

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

Isi dari /etc/apache2/mods-available/wsgi_express.load

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

Isi dari /etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Aktifkan modul dan mulai ulang Apache.

sudo a2enmod wsgi_express
sudo service apache2 restart

5) Periksa bahwa tidak ada kesalahan dalam /var/log/apache2/error.log

samb
sumber
1
Anda mungkin ingin menyebutkan bahwa perintah untuk membuat virtualenv adalah virtualenv -p python3.4 DIRECTORY, atau untuk 3.4+, lebih baik: pyvenv-3.4 DIRECTORY.
nyuszika7h
1
Itu benar ... tapi saya tidak menyebutkannya untuk tetap fokus pada pertanyaan mod_wsgi.
samb
1
Tetapi karena Anda sudah menggunakan virtualenv dalam contoh Anda, mengapa tidak juga menyebutkan cara membuatnya?
nyuszika7h
Jika orang lain mendapatkan kesalahan ( cannot open shared object file: No such file or directory) ketika mencoba melakukan ini, ingatlah untuk mengganti versi di langkah 3. Saya menggunakan Python 3.5, 64-bit. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Jika Anda tidak tahu versi mana yang Anda miliki, buka folder ( /usr/lib/apache2/modules/) dan lihat. Jawaban ini tampaknya didasarkan pada 32-bit python 3.4.
Menghapus
metode ini adalah python-versi-agnostik dan bekerja untuk saya dengan python3.6 sudo /venv_path/bin/mod_wsgi-express install-modulepada langkah 3 akan mencetak jalur yang harus Anda letakkan di wsgi_expressfile
gevra
0

Hanya ingin menambahkan sesuatu ke jawaban yang diterima yang disediakan oleh samb.

Baris aktual konfigurasi yang perlu Anda tambahkan ke modul konfigurasi adalah yang dihasilkan oleh mod_wsgi-express install-moduleperintah (ini tidak eksplisit dalam jawaban yang diterima).

Juga, dalam kasus saya (dan menurut dokumentasi mod_wsgi pkg - mungkin ini tidak terjadi ketika jawaban yang diterima ditulis) Saya tidak mendapatkan wsgi_express.*file mods-available, tetapi hanya wsgi.*, dan itu sudah cukup untuk mengganti wsgi.loadfile dengan konfigurasi baru dengan menjalankan

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

Tentu saja, ini akan menimpa seluruh file, jadi waspadalah jika Anda memiliki arahan di dalamnya.

praimmugen
sumber