Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加快django中的第一页加载_Python_Django_Performance_Mod Wsgi_Pageload - Fatal编程技术网

Python 加快django中的第一页加载

Python 加快django中的第一页加载,python,django,performance,mod-wsgi,pageload,Python,Django,Performance,Mod Wsgi,Pageload,当我更新网站上的代码时,我(自然地)重新启动apache实例,以便更改生效 不幸的是,每个apache实例提供的第一个页面非常慢,因为它第一次将所有内容加载到RAM中(对于这个特定站点,5-7秒) 后续请求只需要0.5-1.5秒,因此我希望消除对用户的影响 有没有比执行wget x次(其中x是我的http.conf中ServerLimit定义的apache实例数)更好的方法将所有内容加载到RAM中 在我看来,编写一个重启apache并运行wget 5次的重启脚本似乎有点麻烦 谢谢 您如何运行Dj

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

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

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

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

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


谢谢

您如何运行Django(mod_python vs mod_wsgi)

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

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


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>
将“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>
#定义流程组。
WSGIDaemonProcess django显示名称=%{GROUP}
#装载应用程序并指定哪个进程组和
#运行它的应用程序组(Python解释器)。作为
#进程组和名为的应用程序组,将具有
#预加载应用对过程启动的副作用。
WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi\
进程组=django应用程序组=%{GLOBAL}
命令拒绝,允许
通融

也就是说,不需要使用单独的WSGIImportScript指令作为特定的进程组和应用程序组作为WSGIScriptAlias的参数,而副作用是它将预加载应用程序。

实际上,编写一个重新启动apache并运行
wget
5次的重新启动脚本对我来说似乎是一个合理的方法。尽管您可能必须小心,以确保对
wget
的每个调用都由不同的进程来处理,但您可能必须加载多次才能确定。我已经测试了它和apache配置在webpartion(应用程序所在的位置)中,会循环使用实例,因此5
wget
的trick@Jim-听起来不错(还有webparty规则)。我一直在想为什么它没有重新加载应用程序!我必须用touch wsgi脚本替换我的重启脚本:)这能解决我的第一个加载问题吗?还是我仍然需要wget?它将减少第一次加载所花费的时间,但不会消除它。
# 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>