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?

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.