apache ที่ไม่ตอบสนอง + mod_wsgi หลังจากติดตั้ง scipy


10

ฉันกำลังใช้งานเซิร์ฟเวอร์ Centos 6.4 ด้วย Apache 2.2.15 และ mod_wsgi 3.2 เซิร์ฟเวอร์กำลังโฮสต์ไซต์ที่ใช้ django (django 1.5.1, python 2.6.6) ทุกอย่างทำงานได้ดีจนกระทั่งฉันติดตั้ง scipy 0.12.0 ผ่าน pip ตอนนี้เมื่อฉันพยายามโหลดแอพ django เซิร์ฟเวอร์ไม่ตอบสนองและปรากฏว่ากระบวนการ httpd ลูกที่วางไข่หยุดทำงาน การดูบันทึกของฉัน (/ var / logs / httpd / error_log, vhost error.log และบันทึกระบบของฉัน) จะไม่มีข้อผิดพลาด

ถ้าฉันโหลดแบบจำลองของฉัน ฯลฯ ผ่าน django Manage.py shell ทุกอย่างใช้งานได้ดีซึ่งทำให้ฉันเชื่อว่าเป็นปัญหา mod_wsgi

มีความคิดเห็นเกี่ยวกับวิธีเริ่มแก้ไขปัญหานี้หรือไม่

คำตอบ:


22

แพ็คเกจบุคคลที่สามบางส่วนสำหรับ Python ที่ใช้โมดูลส่วนขยาย C และรวมถึง scipy และ numpy จะทำงานในล่ามหลักของ Python เท่านั้นและไม่สามารถใช้ในล่ามย่อยเป็น mod_wsgi ตามค่าเริ่มต้นที่ใช้ ผลลัพธ์อาจเป็นเธรดการล็อกการทำงานที่ไม่ถูกต้องหรือกระบวนการขัดข้อง เหล่านี้มีรายละเอียดใน:

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

วิธีแก้ปัญหาคือบังคับให้แอปพลิเคชัน WSGI ทำงานในล่ามหลักของกระบวนการโดยใช้:

WSGIApplicationGroup %{GLOBAL}

หากใช้แอปพลิเคชัน WSGI หลายตัวบนเซิร์ฟเวอร์เดียวกันคุณจะต้องเริ่มการตรวจสอบโดยใช้โหมด daemon เนื่องจากกรอบงานบางอย่างไม่อนุญาตให้หลายอินสแตนซ์ทำงานในล่ามเดียวกัน นี่เป็นกรณีของ Django ดังนั้นใช้โหมด daemon เพื่อให้แต่ละคนอยู่ในกระบวนการของตัวเองและบังคับให้แต่ละคนทำงานในล่ามหลักของกลุ่มกระบวนการโหมด daemon ที่เกี่ยวข้อง


สวัสดี Graham คุณสามารถปรับปรุงคำตอบนี้ในบริบทของ mod-wsgi รุ่นใหม่กว่าได้หรือไม่? โดยเฉพาะนี่ควรจะเป็นปัญหาโดยปริยายถ้าฉันกำหนดค่า apache โดยใช้ mod_wsgi-express ในhttpd.confไฟล์ที่สร้างขึ้นWSGIApplicationGroupไม่ได้ใช้ อย่างไรก็ตามมีอยู่application-group=${GLOBAL}ใน<IfDefine ONE_PROCESS>และ<IfDefine !ONE_PROCESS>บล็อก ฉันเห็นคำสั่ง WSGIDaemonProcess ในhttpd.confไฟล์ที่สร้างขึ้น หมายความว่ามันใช้โหมด daemon อยู่แล้วโดยค่าเริ่มต้น
Kal

หากคุณใช้mod_wsgi-express start-serverหรือรวม Django สำหรับ mod_wsgi-express มันจะทำงานด้วยโหมด daemon เป็นค่าเริ่มต้นและใช้ล่ามหลัก ดังนั้นนี่ไม่ใช่ปัญหาในกรณีนี้ หากคุณกำหนดค่า Apache ด้วยตนเองแสดงว่ายังมีปัญหาอยู่ ONE_PROCESSส่วนหนึ่งเป็นเพียงเมื่อคุณบังคับให้มันเข้าสู่โหมดการแก้ปัญหาในกรณีที่มันทำงานในโหมดกระบวนการฝังตัวเดียว มันยังคงทำงานในล่ามหลักแม้ว่า
Graham Dumpleton

application-groupตัวเลือกคือทางเลือกที่จะใช้WSGIScriptAlias WSGIApplicationGroup
Graham Dumpleton

3

โซลูชันอื่นที่เหมาะสมกับวิธีการกำหนดค่า WSGI ของฉันคือการเปลี่ยนWSGIScriptAliasบรรทัด:

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>

บันทึกคุณสมบัติ

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

ซึ่งมักจะไม่จำเป็นต้องใช้


1
คุณสามารถวางคำสั่ง WSGIScriptReloading เป็นค่าเริ่มต้นที่เปิดและโดยทั่วไปจะไม่ต้องปิด เนื่องจากการใช้ตัวเลือกกลุ่มกระบวนการไปยัง WSGIScriptAlias ​​คุณยังสามารถวางคำสั่ง WSGIProcessGroup ได้
Graham Dumpleton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.