代码之家  ›  专栏  ›  技术社区  ›  Jiaaro

加快django中的第一页加载

  •  22
  • Jiaaro  · 技术社区  · 15 年前

    不幸的是,每个apache实例提供的第一个页面非常慢,因为它第一次将所有内容加载到RAM中(对于这个特定站点,5-7秒)。

    后续请求只需要0.5-1.5秒,因此我希望消除对用户的影响。

    有没有比执行wget x次(其中x是我的http.conf中ServerLimit定义的apache实例数)更好的方法将所有内容加载到RAM中

    在我看来,编写一个重启apache并运行wget 5次的重启脚本似乎有点麻烦。

    谢谢

    2 回复  |  直到 15 年前
        1
  •  32
  •   dfrdmn Graham Dumpleton    13 年前

    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>
    

    使用WSGIDaemonProcess的“display name”选项,您可以通过使用BSD样式的“ps”程序来识别哪些进程。当“display name”设置为“{GROUP}”时,“ps”输出应将“(wsgi:django)”显示为进程名。识别流程ID并执行以下操作:

    kill -SIGINT pid
    

    将“pid”与实际进程ID交换。如果守护进程进程组中有多个进程,则向所有进程发送信号。

    不确定是否可以使用“killall”一步完成此操作。我在MacOS 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
  •  3
  •   Josh Wright    15 年前

    如果您正在运行mod_wsgi(在守护进程模式下),则无需重新启动Apache即可重新加载应用程序。您所需要做的就是更新wsgi脚本的mtime(使用 touch

    mod_wsgi的文档对该过程进行了非常透彻的解释:

    ReloadingSourceCode