Acelerando la carga de la primera página en django

Cuando actualizo el código en mi sitio web, (naturalmente) reinicio mi instancia de apache para que los cambios surtan efecto.

Desafortunadamente, la primera página que recibe cada instancia de apache es bastante lenta mientras carga todo en la RAM por primera vez (5-7 segundos para este sitio en particular).

Las solicitudes posteriores solo tardan entre 0,5 y 1,5 segundos, por lo que me gustaría eliminar este efecto para mis usuarios.

¿Hay una mejor manera de cargar todo en la RAM que hacer un wget x veces (donde x es el número de instancias de apache definidas por ServerLimit en mi http.conf)

Escribir un script de reinicio que reinicie apache y se ejecute wget 5 veces me parece un poco difícil.

¡Gracias!

El valor predeterminado para Apache / mod_wsgi es cargar solo el código de la aplicación en la primera solicitud a un proceso que requiera esa aplicación. Entonces, el primer paso es configurar mod_wsgi para precargar su código cuando se inicie el proceso y no solo la primera solicitud. Esto se puede hacer en mod_wsgi 2.X usando la directiva WSGIImportScript.

Suponiendo el modo de demonio, que es la mejor opción de todos modos, esto significa que tendrías algo como:

 # 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}  # 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  

Cuando haya realizado un cambio de código, en lugar de tocar el archivo de script WSGI, que solo se verifica en la siguiente solicitud, envíe una señal SIGINT a los procesos en el grupo de procesos del daemon.

Con la opción ‘nombre de pantalla’ para WSGIDaemonProcess puede identificar qué procesos utilizando el progtwig ‘ps’ de estilo BSD. Con ‘display-name’ configurado en ‘% {GROUP}’, la salida de ‘ps’ debería mostrar ‘(wsgi: django)’ como nombre de proceso. Identifique la ID del proceso y haga:

 kill -SIGINT pid 

Intercambie ‘pid’ con la ID del proceso real. Si hay más de un proceso en el grupo de procesos de daemon, envíe una señal a todos ellos.

No estoy seguro si se puede usar ‘killall’ para hacer esto en un solo paso. Tuve problemas para hacerlo en MacOS X.

En mod_wsgi 3.X la configuración puede ser más simple y puede usar en su lugar:

 # 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}  Order deny,allow Allow from all  

Es decir, no es necesario usar una directiva WSGIImportScript por separado, ya que un grupo de procesos y un grupo de aplicaciones específicos como argumentos para WSGIScriptAlias, en cambio, tienen un efecto secundario de que cargará la aplicación.

¿Cómo estás ejecutando Django (mod_python vs mod_wsgi)?

Si está ejecutando mod_wsgi (en modo daemon), no es necesario reiniciar Apache para volver a cargar su aplicación. Todo lo que necesita hacer es actualizar el mtime de su script wsgi (que se realiza fácilmente con el touch ).

La documentación de mod_wsgi tiene una explicación bastante detallada del proceso:

ReloadingSourceCode