Ускорение загрузки первой страницы в Django - PullRequest
22 голосов
/ 09 ноября 2009

Когда я обновляю код на своем веб-сайте, я (естественно) перезагружаю свой экземпляр apache, чтобы изменения вступили в силу.

К сожалению, первая страница, обслуживаемая каждым экземпляром apache, довольно медленная, хотя она загружает все в ОЗУ впервые (5-7 секунд для этого конкретного сайта).

Последующие запросы занимают всего 0,5 - 1,5 секунды, поэтому я хотел бы устранить этот эффект для моих пользователей.

Есть ли лучший способ загрузить все в ОЗУ, чем сделать wget x раз (где x - количество экземпляров apache, определенных ServerLimit в моем http.conf)

Написание скрипта перезапуска, который перезапускает apache и запускает wget 5 раз, кажется мне несколько хакерским.

Спасибо!

Ответы [ 2 ]

32 голосов
/ 10 ноября 2009

По умолчанию для Apache / mod_wsgi загружать код приложения только по первому запросу в процесс, который требует, чтобы приложения. Итак, первый шаг - настроить mod_wsgi для предварительной загрузки кода при запуске процесса, а не только с первым запросом. Это можно сделать в mod_wsgi 2.X с использованием директивы WSGIImportScript.

Предполагается, что режим демона, который в любом случае является лучшим вариантом, означает, что у вас будет что-то вроде:

# Define process group.

WSGIDaemonProcess django display-name=%{GROUP}

# Mount application.

WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi

# Ensure application preloaded on process start. Must specify the
# process group and application group (Python interpreter) to use.

WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \
  process-group=django application-group=%{GLOBAL}

<Directory /usr/local/django/mysite/apache>

    # Ensure application runs in same process group and application
    # group as was preloaded into on process start.

    WSGIProcessGroup django
    WSGIApplicationGroup %{GLOBAL}

    Order deny,allow
    Allow from all
</Directory>

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

С помощью опции 'display-name' для WSGIDaemonProcess вы можете определить, какие процессы, с помощью программы BSD в стиле BSD. Если для параметра display-name установлено значение «% {GROUP}», в выводе «ps» в качестве имени процесса должно отображаться «(wsgi: django)». Определите идентификатор процесса и выполните:

kill -SIGINT pid

Поменять 'pid' на фактический идентификатор процесса. Если в группе процессов-демонов более одного процесса, отправьте сигнал всем им.

Не уверен, можно ли использовать killall, чтобы сделать это за один шаг. У меня были проблемы с этим на MacOS X.

В mod_wsgi 3.X конфигурация может быть проще и может использоваться вместо:

# Define process group.

WSGIDaemonProcess django display-name=%{GROUP}

# Mount application and designate which process group and
# application group (Python interpreter) to run it in. As
# process group and application group named, this will have
# side effect of preloading application on process start.

WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi \
  process-group=django application-group=%{GLOBAL}

<Directory /usr/local/django/mysite/apache>
    Order deny,allow
    Allow from all
</Directory>

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

3 голосов
/ 09 ноября 2009

Как у вас работает Django (mod_python против mod_wsgi)?

Если вы используете mod_wsgi (в режиме демона), перезапуск Apache не требуется для перезагрузки вашего приложения. Все, что вам нужно сделать, это обновить mtime вашего wsgi-скрипта (что легко сделать с помощью touch).

Документация mod_wsgi содержит довольно подробное объяснение процесса:

ReloadingSourceCode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...