Apache non-responsif + mod_wsgi setelah menginstal scipy

10

Saat ini saya menjalankan server Centos 6.4, dengan Apache 2.2.15 dan mod_wsgi 3.2. Server hosting situs berbasis Django (Django 1.5.1, python 2.6.6). Semuanya berjalan dengan baik sampai saya menginstal scipy 0.12.0 via pip. Sekarang, ketika saya mencoba memuat aplikasi Django, server tidak merespons, dan tampaknya proses httpd anak yang muncul hang. Melihat melalui log saya (/ var / logs / httpd / error_log, vhost error.log saya, dan log sistem saya) tidak menghasilkan kesalahan.

Jika saya memuat model saya, dll. Melalui django manage.py shell, semuanya berfungsi dengan baik, yang membuat saya percaya itu adalah masalah mod_wsgi.

Adakah pemikiran tentang bagaimana memulai pemecahan masalah ini?

MarkD
sumber

Jawaban:

22

Beberapa paket pihak ketiga untuk Python yang menggunakan modul ekstensi C, dan ini termasuk scipy dan numpy, hanya akan bekerja di interpreter utama Python dan tidak dapat digunakan dalam sub-penerjemah sebagai mod_wsgi secara default menggunakan. Hasilnya bisa berupa kebuntuan utas, perilaku salah atau proses macet. Ini dirinci dalam:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API

Solusinya adalah untuk memaksa aplikasi WSGI untuk berjalan di penerjemah utama dari proses menggunakan:

WSGIApplicationGroup %{GLOBAL}

Jika menjalankan beberapa aplikasi WSGI pada server yang sama, Anda ingin memulai investigasi menggunakan mode daemon karena beberapa kerangka kerja tidak mengizinkan beberapa instance berjalan dalam interpreter yang sama. Inilah yang terjadi dengan Django. Jadi gunakan mode daemon sehingga masing-masing dalam prosesnya sendiri dan paksakan masing-masing untuk berjalan dalam juru bahasa utama dari masing-masing kelompok proses mode daemon.

Graham Dumpleton
sumber
Hai Graham, dapatkah Anda memperbarui jawaban ini dalam konteks versi mod-wsgi yang lebih baru? Secara khusus, apakah ini seharusnya menjadi masalah secara default jika saya telah mengkonfigurasi apache menggunakan mod_wsgi-express? Dalam httpd.conffile yang dihasilkan , WSGIApplicationGrouptidak digunakan. Namun, ada application-group=${GLOBAL}di blok <IfDefine ONE_PROCESS>dan <IfDefine !ONE_PROCESS>. Saya melihat arahan WSGIDaemonProcess dalam httpd.conffile yang dihasilkan . Apakah itu berarti sudah menggunakan mode daemon secara default?
Kal
Jika Anda menggunakan mod_wsgi-express start-serveratau integrasi Django untuk mod_wsgi-express berjalan dengan mode daemon sebagai default dan menggunakan penerjemah utama. Jadi ini bukan masalah dalam kasus itu. Jika Anda mengkonfigurasi Apache secara manual, maka masih ada masalah. Bagian ONE_PROCESSini hanya untuk saat Anda memaksanya ke mode debug, dalam hal ini ia berjalan dalam mode tertanam satu proses. Itu masih berjalan di interpreter utama sekalipun.
Graham Dumpleton
The application-grouppilihan pada WSGIScriptAliasadalah sebuah alternatif untuk menggunakan WSGIApplicationGroup.
Graham Dumpleton
3

Solusi lain yang sesuai dengan cara saya mengkonfigurasi WSGI adalah mengubah WSGIScriptAliasbaris:

WSGIDaemonProcess website user=user group=group python-path=/path/to/venv/website:/path/to/venv/lib/python2.7/site-packages
WSGIScriptAlias /website /path/to/venv/website/wsgi.py process-group=website application-group=%{GLOBAL}

<Location /website>
        WSGIProcessGroup website
</Location>

<Directory /path/to/venv/website>
        WSGIScriptReloading On
        <Files wsgi.py>
                Allow from all
                Require all granted
        </Files>
</Directory>

perhatikan atributnya

process-group=website application-group=%{GLOBAL}

yang biasanya tidak diperlukan

Nils Werner
sumber
1
Anda dapat menghapus arahan WSGIScriptReloading karena defaultnya adalah hidup dan umumnya tidak perlu dimatikan. Karena menggunakan opsi grup proses ke WSGIScriptAlias, Anda juga dapat menghapus arahan WSGIProcessGroup.
Graham Dumpleton