Подтвердить что ты не робот

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

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

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

По умолчанию для 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 script файла, который проверяется только при следующем запросе, отправьте сигнал SIGINT в процессы в группе процессов демона.

С помощью опции "display-name" для WSGIDaemonProcess вы можете определить, какие процессы используются с помощью программы "ps" в стиле 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 ​​вместо этого с побочным эффектом, что он будет предварительно загружать приложение.

Ответ 2

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

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

Документация

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

ReloadingSourceCode