Django — конец вывода скрипта перед заголовками

Базовый hello.wsgi работает нормально. Другое приложение django также идеально работает с абсолютно такой же версией virtualenv.

mod_wsgi зависает на ~10 минут (!!!), и я вижу, что ничто не может указать мне на проблему (отладка на уровне логирования):

[Tue Mar 25 23:11:08.878578 2014] [:info] [pid 4719:tid 140720591648640] mod_wsgi (pid=4719): Attach interpreter ''.
[Tue Mar 25 23:11:08.879171 2014] [:info] [pid 4717:tid 140720591648640] mod_wsgi (pid=4717): Attach interpreter ''.
[Tue Mar 25 23:11:10.891348 2014] [authz_core:debug] [pid 4730:tid 140720477226752] mod_authz_core.c(802): [client 127.0.0.1:40844] AH01626: authorization result of Require all granted: granted
[Tue Mar 25 23:11:10.891391 2014] [authz_core:debug] [pid 4730:tid 140720477226752] mod_authz_core.c(802): [client 127.0.0.1:40844] AH01626: authorization result of <RequireAny>: granted
[Tue Mar 25 23:11:10.891489 2014] [authz_core:debug] [pid 4730:tid 140720477226752] mod_authz_core.c(802): [client 127.0.0.1:40844] AH01626: authorization result of Require all granted: granted
[Tue Mar 25 23:11:10.891497 2014] [authz_core:debug] [pid 4730:tid 140720477226752] mod_authz_core.c(802): [client 127.0.0.1:40844] AH01626: authorization result of <RequireAny>: granted
[Tue Mar 25 23:11:10.903921 2014] [:info] [pid 4719:tid 140720469034752] mod_wsgi (pid=4719): Create interpreter 'prj-dev|'.
[Tue Mar 25 23:11:10.905378 2014] [:info] [pid 4719:tid 140720469034752] [remote 127.0.0.1:57616] mod_wsgi (pid=4719, process='prj.project-dev', application='prj-dev|'): Loading WSGI script '/var/www/prj.project-dev/venv/www/public/index.wsgi'.
[Tue Mar 25 23:11:12.014799 2014] [:error] [pid 4719:tid 140720469034752] /usr/lib/python2.7/dist-packages/numpy/oldnumeric/__init__.py:11: ModuleDeprecationWarning: The oldnumeric module will be dropped in Numpy 1.9
[Tue Mar 25 23:11:12.014843 2014] [:error] [pid 4719:tid 140720469034752]   warnings.warn(_msg, ModuleDeprecationWarning)
[Tue Mar 25 23:11:12.014846 2014] [:error] [pid 4719:tid 140720469034752] 
[Tue Mar 25 23:16:11.888631 2014] [:info] [pid 4719:tid 140720485820160] mod_wsgi (pid=4719): Daemon process deadlock timer expired, stopping process 'prj.project-dev'.
[Tue Mar 25 23:16:11.888761 2014] [:info] [pid 4719:tid 140720591648640] mod_wsgi (pid=4719): Shutdown requested 'prj.project-dev'.
[Tue Mar 25 23:16:16.889065 2014] [:info] [pid 4719:tid 140720121513728] mod_wsgi (pid=4719): Aborting process 'prj.project-dev'.
[Tue Mar 25 23:16:16.895499 2014] [core:error] [pid 4730:tid 140720477226752] [client 127.0.0.1:40844] End of script output before headers: index.wsgi
[Tue Mar 25 23:16:17.160980 2014] [:info] [pid 5295:tid 140720591648640] mod_wsgi (pid=5295): Attach interpreter ''.

Конфиг апача тоже ничего интересного не содержит. Такая же конфигурация работает на другом сервере.

<VirtualHost *:80>
    ServerName prj-dev
    ServerAdmin [email protected]
    DocumentRoot "/var/www/prj.project-dev/venv/www/public"
    ErrorLog /var/log/apache2/prj.project-dev/error_log
    CustomLog /var/log/apache2/prj.project-dev/access_log common

    Alias /media/ /var/www/prj.project-dev/venv/prj/prj/media/
    Alias /static/ /var/www/prj.project-dev/venv/prj/prj/static/
    Alias /usermedia/ /var/www/prj.project-dev/venv/prj/prj/usermedia/

    <Directory /var/www/prj.project-dev/venv/prj/prj/usermedia>
        Order deny,allow
        Allow from all
    </Directory>

    <Directory /var/www/prj.project-dev/venv/prj/prj/media>
        Order deny,allow
        Allow from all
    </Directory>

    <Directory /var/www/prj.project-dev/venv/prj/prj/static>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIDaemonProcess prj.project-dev user=user group=user processes=2 threads=2 display-name=%{GROUP}
    WSGIProcessGroup prj.project-dev
    WSGIScriptAlias / /var/www/prj.project-dev/venv/www/public/index.wsgi

    XSendFile on

    <Directory /var/www/prj.project-dev/venv/www/public>
        Order deny,allow
        Allow from all
    </Directory>

</VirtualHost>

Ничего интересного в wsgi:

import os, sys

activate_this = '/var/www/prj.project-dev/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
sys.path = [
    '/var/www/prj.project-dev/venv/lib/python2.7/site-packages/',
    '/var/www/prj.project-dev/venv/prj/',
    '/var/www/prj.project-dev/venv/',
] + sys.path

os.environ['DJANGO_SETTINGS_MODULE'] = 'prj.settings'

import django.core.handlers.wsgi
#from raven.contrib.django.middleware.wsgi import Sentry

application = django.core.handlers.wsgi.WSGIHandler()
#application = Sentry(django.core.handlers.wsgi.WSGIHandler())

Мой вопрос: как я могу узнать настоящую причину, по которой он зависает?


person night-crawler    schedule 25.03.2014    source источник
comment
Создайте отдельный вопрос и перечислите модули, которые вы используете, в качестве вывода с pip feeze и, вероятно, сможете легко определить проблемные модули.   -  person Graham Dumpleton    schedule 13.03.2017


Ответы (4)


Это описано в документации mod_wsgi.

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

Короче говоря, вы, вероятно, используете модуль расширения Python, который не реализован для правильной работы в интерпретаторе Python. Это или модуль расширения не освобождает GIL должным образом при выполнении блокирующих операций. Оба могут привести к взаимоблокировке интерпретатора.

Используйте решение в документации и посмотрите, поможет ли оно.

person Graham Dumpleton    schedule 26.03.2014
comment
Спасибо за ваш ответ. Я случайно обнаружил, почему это происходит при очистке импорта в проекте: в одном модуле я импортировал локальную библиотеку с текущим префиксом приложения (он и в sys.path тоже): app.permissions. Затем я изменил его на permissions, и это сработало. Похоже на циклический импорт, но с предыдущей версией apache 2.2.2 && mod_wsgi таких проблем не было. Также не было этой ошибки с django runserver. И до сих пор я понятия не имею, как поймать его без аварий. Может быть, использовать оболочку профилировщика вокруг приложения, чтобы увидеть самые жесткие вызовы? Но будет ли он производить вывод, если wsgi убьет его? - person night-crawler; 26.03.2014
comment
Это звучит неправильно. Циклический импорт не должен вызывать взаимоблокировок. - person Graham Dumpleton; 28.03.2014
comment
Я знаю эту проблему с matplotlib. print_figure Matplotlib воспроизводимо зависает с указанным выше сообщением об ошибке тайм-аута. WSGIApplicationGroup %{GLOBAL} помогает. Все со стандартными пакетами Ubuntu 14.10. Известная проблема? - person Torsten Bronger; 08.05.2015
comment
Да, matplotlib — это один пакет, который, как известно, имеет эту проблему. - person Graham Dumpleton; 09.05.2015
comment
@TorstenBronger, ты должен ответить на это - person User; 17.03.2017
comment
Большое спасибо за это! Есть ли какой-либо ресурс, который составляет список пакетов с известными проблемами GIL, подобными этому? Я столкнулся с аналогичной проблемой с приложением Flask, несмотря на наличие WSGIApplicationGroup %{GLOBAL}, как описано в ссылке. - person Sean Easter; 24.07.2017
comment
Если у вас возникла похожая проблема, задайте новый вопрос об этом и объясните его, а также предоставьте свою конфигурацию mod_wsgi. Нередко люди ошибаются в своей конфигурации, так что WSGIApplicationGroup %{GLOBAL} используется не так, как они думают. - person Graham Dumpleton; 25.07.2017

<VirtualHost *:80>
    ServerName localhost
    ServerAlias localhost
    ServerAdmin [email protected]

    <Directory /var/www/mysite/mysite>
    AddHandler wsgi-script .py
    Options +ExecCGI
    </Directory>

    DocumentRoot /var/www/mysite
    WSGIDaemonProcess myproject python-path=/var/www/mysite:/var/www/environ/lib/python2.7/site-packages
    #WSGIProcessGroup mysite
    WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py

    WSGIApplicationGroup %{GLOBAL}

    <Directory /var/www/mysite/mysite/>


    order deny,allow
    Allow from all
    </Directory>

I also had the same error and I have solved this issue by using this configuration.

Также добавьте следующую строку в /etc/apache2/apache.config

#WSGIPythonPath /var/www/mysite
person raghavyadav990    schedule 07.12.2015

Я знаю, что этой ветке уже три года, но я наткнулся на нее, когда у меня возникла аналогичная проблема, поэтому я решил добавить свое решение. В моем случае это было что-то в виртуальной среде, что требовало включения mod_ssl в Apache, хотя ни один из сайтов не использовал SSL (ну, они используют, но он отключен в другом месте). Так

a2enmod ssl
service apache2 restart

Починил это.

person Paul Turton    schedule 20.05.2017

После изучения ответов выше. Пришлось поставить количество процессов от 5 до 1. Так же с помощью мультиворкера mpm.

LoadModule mpm_worker_module modules/mod_mpm_worker.so
WSGIDaemonProcess music user=apache group=apache processes=1 threads=30  python-path=/srv/www/music/service/venv/lib/python2.7/site-packages
person Pat W    schedule 31.05.2017
comment
Это само по себе не должно иметь значения, оно форсирует WSGIApplicationGroup %{GLOBAL}, что почти всегда является ответом на эту проблему. Также прочитайте modwsgi.readthedocs.io/en/develop/user -guides/ о настройке виртуальной среды предпочтительным образом. Не используйте python-path для этого. - person Graham Dumpleton; 31.05.2017