Ускорение загрузки первой страницы в 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 имеет довольно подробное объяснение процесса: