Ускорение загрузки первой страницы в django

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

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

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

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

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

спасибо!

2 ответов


по умолчанию 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 style 'ps'. Если "отображаемое имя" установлено в " %{GROUP}", вывод " ps "должен показывать" (wsgi:django) " как имя процесса. Определите идентификатор процесса и выполните:

kill -SIGINT pid

Swap ' 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 вместо побочного эффекта, который он будет предварительно загружать приложение.


Как вы используете Django (mod_python vs mod_wsgi)?

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

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

ReloadingSourceCode