Назад | Перейти на главную страницу

Не отвечает apache + mod_wsgi после установки scipy

В настоящее время я использую сервер 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, все работает нормально, что наводит меня на мысль, что это проблема с mod_wsgi.

Есть мысли о том, как начать устранение неполадок?

Некоторые сторонние пакеты для Python, которые используют модули расширения C, в том числе scipy и numpy, будут работать только в основном интерпретаторе Python и не могут использоваться во вспомогательных интерпретаторах, поскольку по умолчанию используется mod_wsgi. Результатом может быть взаимоблокировка потоков, неправильное поведение или сбои процессов. Это подробно описано в:

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

Обходной путь - заставить приложение WSGI запускаться в основном интерпретаторе процесса, используя:

WSGIApplicationGroup %{GLOBAL}

Если вы запускаете несколько приложений WSGI на одном сервере, вы можете начать исследование, используя режим демона, потому что некоторые платформы не позволяют запускать несколько экземпляров в одном интерпретаторе. Так обстоит дело с Django. Таким образом, используйте режим демона, чтобы каждый был в своем собственном процессе, и заставьте каждого работать в основном интерпретаторе их соответствующих групп процессов режима демона.

Другим решением, подходящим моему способу настройки 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}

которые обычно не требуются