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

加速django中的第一页加载

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

    2 回复  |  直到 16 年前
        1
  •  32
  •   dfrdmn Graham Dumpleton    14 年前

    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信号。

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

    kill -SIGINT pid
    

    不确定“killall”是否可以一步完成此操作。我在MacOSX上做这件事有问题。

    在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
  •  3
  •   Josh Wright    16 年前

    你是如何运行Django的(mod_python vs mod_wsgi)?

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

    mod_wsgi的文档对这个过程有一个非常全面的解释:

    ReloadingSourceCode