加快 django 中的首页加载速度

2023-12-31

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

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

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

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

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

Thanks!


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加快 django 中的首页加载速度 的相关文章

随机推荐

  • Visual Studio 2013,TFS 非常慢

    当我最初安装 VS Ultimate 2013 时 一切都很好 但在上个月左右的时间里 它一直很糟糕 我的 Visual Studio 2013 安装中的源代码管理浏览非常慢 只需单击一个节点 显示该节点内容的操作就需要 20 多秒 团队中
  • 从sql plus中的字符串中删除最后一个字符

    我试图从 sql plus 的列输出中删除最后一个字符 列条目的长度不固定 例如 XYZA 应输出为 XYZ 我尝试过使用substr 功能 但似乎不起作用 SUBSTR ooo CO NAME 1 LENGTH ooo CO NAME 1
  • 如何使用 sed 命令在模式字符串之前添加字符串?

    我想使用 sed 修改名为 baz 的文件 当我搜索模式 foo 时 foo 不在行首或行尾 我想在 foo 之前附加 bar 我该如何使用 sed 来做到这一点 Input file named baz blah foo blahblah
  • 在 flutter 中通过 Function(T) 传递泛型类型

    我正在尝试创建一个通用的消费者小部件 以方便其子视图模型 因此我有两个功能 一个在 ViewModel 初始化之后有一个函数 T 另一个用于将模型传递给它的子 Widget 通用类中是 ChangeNotifier 的子级 在我想在两个函数
  • 带有 ActionBarSherlock 的本机 ActionBar selectableItemBackground

    我尝试更改操作栏中所选项目的背景 我使用 ActionBarSherlock 来与旧版 Android 版本兼容 当应用程序在带有 ICS 的设备上运行时 我为我的 Activity 设置了特定主题 这是我目前的风格
  • 变换所有子视图

    我在滚动视图中有一个 UIView 其中包含大约 100 个子视图 子视图看起来都一样 并且是同一类的实例 我有一个要应用于每个子视图的转换 但每次 ZoomScale 改变时 变换都需要改变 将变换应用于所有视图的最佳方法是什么 目前我正
  • 更改 IOS Xamarin Forms 中的开关颜色

    如何在切换 IOS Xamarin Forms 时更改切换按钮的颜色 自定义渲染将仅设置颜色一次 Xamarin 表单切换按钮在 IOS 上的默认颜色 https stackoverflow com questions 38993959 x
  • 如何限制bash中函数中使用的线程/子进程的数量

    我的问题是如何更改此代码 使其仅使用 4 个线程 子进程 TESTS a b c d e for f in TESTS do t RANDOM 5 1 sleep t echo f t done wait 有趣的问题 我尝试使用 xargs
  • 使用 JSON 字符串填充表布局

    我的 Web 服务返回一个 JSON 字符串 如下所示 checkrecord rollno abc2 percentage 40 attended 12 missed 34 Table1 上面的字符串代表我的数据集 我已将字符串转换为 J
  • Fluent NHibernate 集合每个子类表

    我在 Fluent NHibernate 中的继承方面遇到问题 我之前已经设法让 Table Per Subclass 工作 但我无法让基类的集合工作 它正在寻找一个我没有的基类表 这是我的架构 User Id Name Email Use
  • VB.NET - 迭代容器对象中的控件

    我有一个带有 清除 按钮的表单 当用户单击 清除 时 我想清除表单上所有可见元素的值 对于日期控件 我想将它们重置为当前日期 我的所有控件都包含在面板上 现在 我正在使用以下代码执行此操作 有没有比手动检查每种控件类型更简单的方法 这种方法
  • Kubernetes 中被逐出的 Pod 会发生什么?

    我刚刚看到我的一些 pod 被 kubernetes 驱逐 他们会发生什么 就这样闲逛 还是我必须手动删除它们 我使用的一个快速解决方法是在事件发生后手动删除所有被逐出的 Pod 您可以使用此命令 kubectl get pods all
  • Swift:从 url 检索音频文件标记列表?

    我只想获取音频文件中的标记列表 我认为这将是一项简单的常见任务 不会太困难 但是 我几乎找不到任何示例代码或文档 所以我最终得到了以下结果 private func getMarkers url CFURL gt AudioFileMark
  • 打印所有已加载的 Spring bean - Spring Boot

    我怎样才能知道作为我的 Spring Boot 应用程序的一部分加载的所有 Bean 的名称 我希望在 main 方法中有一些代码来打印服务器启动后加载的 bean 的详细信息 如spring boot的入门指南所示 https sprin
  • 是否可以使用 peewee python ORM 对多个字段进行 sql 连接?

    假设我们有这三个模型 class Item BaseModel title CharField class User BaseModel name CharField class UserAnswer BaseModel user Fore
  • Redis 上限排序集、列表或队列?

    有人在 Redis 中实现过任何类型的上限数据结构吗 我正在致力于构建类似新闻源的东西 提要最终会被频繁地操作和读取 将其保存在 Redis 中的排序集中对于我的用例来说是便宜且完美的 唯一的问题是我每个 feed 只需要 n 个项目 而且
  • 为 WCF 设置 Ninject [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁有关于如何在 WCF 中设置 Ninject 的明确说明吗 一直在谷歌搜索 但我看不到任何关于如何在 WCF 中使用 Ninject
  • 无法获取特定捐赠者的 searchBook 方法

    该程序的目标是输入书的标题 捐赠者 章节数和位置 从那里 用户输入以下提示 搜索输入捐赠者姓名 我能够将所有这些信息作为输出 然而 我似乎无法弄清楚如何将结果范围缩小到只有一位捐赠者 相反 我的程序打印出条目中列出的所有捐赠者 我在下面列出
  • 在 Android Studio 中更新到 Gradle 3.3.2 时出错:无法解析符号 R

    如果我通过更改来更新 Gradle dependencies classpath com android tools build gradle 3 x x 从版本3 2 1到版本3 3 2我得到了Cannot resolve symbol
  • 加快 django 中的首页加载速度

    当我更新网站上的代码时 我 自然 会重新启动我的 apache 实例 以便更改生效 不幸的是 每个 apache 实例提供的第一个页面在第一次将所有内容加载到 RAM 中时非常慢 对于这个特定站点需要 5 7 秒 后续请求只需要 0 5 1