2009-11-09 8 views
22

Lorsque je mets à jour le code sur mon site Web, je redémarre (naturellement) mon instance apache pour que les modifications soient appliquées.Accélérer le chargement de la première page dans django

Malheureusement la première page servie par chaque instance d'apache est assez lente alors qu'elle charge tout dans la RAM pour la première fois (5-7 sec pour ce site particulier).

Les demandes suivantes ne prennent que 0,5 à 1,5 secondes, donc je voudrais éliminer cet effet pour mes utilisateurs.

est-il une meilleure façon d'obtenir tout chargé dans la RAM que pour faire un wget x fois (où x est le nombre d'instances apache définies par ServerLimit dans mon http.conf)

Rédaction d'un script de redémarrage redémarre apache et exécute wget 5 fois me semble un peu hacky.

Merci!

+4

En fait, écrire un script de redémarrage qui redémarre apache et exécute 'wget' 5 fois me semble une approche raisonnable. –

+2

Bien que vous deviez faire attention à ce que chacun de ces appels à 'wget' soit traité par un processus différent - vous devrez probablement le charger un bon nombre de fois pour être sûr. –

+1

Je l'ai testé et la configuration apache à webfaction (où l'application est hébergée) fait défiler les instances de sorte que 5 'wget' fait l'affaire – Jiaaro

Répondre

31

La valeur par défaut pour Apache/mod_wsgi est seulement le code d'application de la charge sur la première demande à un processus qui exige que les applications. Donc, la première étape est de configurer mod_wsgi pour précharger votre code lorsque le processus démarre et pas seulement la première requête. Cela peut être fait dans mod_wsgi 2.X en utilisant la directive WSGIImportScript.

présumant mode démon, qui est meilleure option de toute façon, cela signifie que vous auriez quelque chose comme:

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

Lorsque vous avez fait un changement de code, au lieu de toucher le fichier script WSGI, qui est seulement vérifié sur À la demande suivante, envoyez un signal SIGINT aux processus du groupe de processus démon à la place. Avec l'option 'nom d'affichage' de WSGIDaemonProcess, vous pouvez identifier les processus en utilisant le programme 'ps' de style BSD. Avec 'display-name' défini sur '% {GROUP}', la sortie 'ps' doit afficher '(wsgi: django)' comme nom de processus. Identifiez l'ID de processus et faites:

kill -SIGINT pid 

Échangez 'pid' avec l'ID de processus réel. Si plus d'un processus dans le groupe de processus daemon, envoie un signal à tous.

Vous ne savez pas si 'killall' peut être utilisé pour faire cela en une seule fois. J'ai eu un problème de le faire sur Mac OS X.

Dans mod_wsgi 3.X la configuration peut être plus simple et peut utiliser à la place:

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

C'est pas nécessaire d'utiliser la directive de WSGIImportScript séparée comme processus spécifique peut groupe et le groupe d'applications en tant qu'arguments à WSGIScriptAlias ​​à la place avec effet secondaire qu'il va précharger l'application.

3

Comment utilisez-vous Django (mod_python vs mod_wsgi)?

Si vous utilisez mod_wsgi (en mode démon), il n'est pas nécessaire de redémarrer Apache pour recharger votre application. Tout ce que vous devez faire est de mettre à jour le mtime de votre script wsgi (ce qui est fait facilement avec touch).

la documentation mod_wsgi a une explication assez approfondie du processus:

ReloadingSourceCode

+0

Je me demandais pourquoi il ne rechargeait pas l'application! Je vais devoir remplacer mon script de redémarrage par un script wsgi tactile :) cela résoudra-t-il mon premier problème de chargement? ou ai-je encore besoin de wget? – Jiaaro

+0

Cela réduira le temps passé sur la première charge, mais ne l'éliminera pas. –

Questions connexes