python - 加快 django 中的首页加载速度

标签 python django performance mod-wsgi pageload

当我在我的网站上更新代码时,我(自然地)重新启动我的 apache 实例以使更改生效。

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

后续请求只需要 0.5 - 1.5 秒,所以我想为我的用户消除这种影响。

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

编写一个重启 apache 并运行 wget 5 次的重启脚本对我来说似乎有点 hacky。

谢谢!

最佳答案

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 的 'display-name' 选项,您可以使用 BSD 风格的 'ps' 程序识别哪些进程。将 'display-name' 设置为 '%{GROUP}','ps' 输出应该显示 '(wsgi:django)' 作为进程名称。确定进程 ID 并执行:

kill -SIGINT pid

用实际进程 ID 交换“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 的参数,而是会预加载应用程序。

关于python - 加快 django 中的首页加载速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702562/

相关文章:

python - Class_weight 和 sample_weight 对 sklearn Random Forest 无效

python - SOAPpy - 如何传递安全 header ?

Django 模型 : change db_table dynamically

java - 执行乘法最有效的方法是什么?

javascript - 在 IE 8 中加速 ":not"jQuery CSS 选择器?

python - 使用 matplotlib 将日期设置为 x 轴上的第一个字母

python - 数据表过滤器不在

django - 重定向后如何在 Django 中测试上下文和 session ?

django - auth.views.Loginview 显示 "__init__() got an unexpected keyword argument ' 请求'“

python - 基于数组的向量化矩阵选择