当我在我的网站上更新代码时,我(自然地)重启我的apache实例以使更改生效。
不幸的是,每个apache实例服务的第一个页面在第一次将所有内容加载到RAM中时都非常慢(对于这个特定的站点,需要5-7秒)。
后续请求只需要0.5 - 1.5秒,所以我想消除这种影响,为我的用户。
有没有更好的方法将所有内容加载到内存中,而不是执行wget x次(其中x是由http.conf中的ServerLimit定义的apache实例的数量)?
在我看来,编写一个重启apache并运行wget 5次的重启脚本似乎有点老生常谈。
谢谢!
发布于 2009-11-10 06:19:00
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将“pid”替换为实际进程ID。如果守护进程组中有多个进程,则向所有进程发送信号。
不确定是否可以使用“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-10 01:47:43
你是如何运行Django (mod_python与mod_wsgi)的?
如果您正在运行mod_wsgi (在守护进程模式下),那么重启Apache并不是重新加载应用程序所必需的。您所需要做的就是更新wsgi脚本的mtime (使用touch可以很容易地完成)。
mod_wsgi的文档对这个过程有非常透彻的解释:
ReloadingSourceCode
https://stackoverflow.com/questions/1702562
复制相似问题