22

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

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

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

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

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

谢谢!

4

2 回答 2

32

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 的参数,而是会产生预加载应用程序的副作用。

于 2009-11-09T22:18:59.603 回答
3

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

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

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

重新加载源代码

于 2009-11-09T17:47:43.060 回答