通过模块、最佳编码实践和正确的服务器配置提高 Drupal 9 性能

已发表: 2020-08-11

您可以拥有拥有大量内存的最强大的服务器,但这足以确保网站的高性能吗? 使用 Drupal,可以轻松地根据您的业务增长扩展网站。 事实上,这正是 Drupal 所擅长的。 但是,网页、功能和内容的突然增加可能会影响其性能。 Drupal 9 现在就在这里,并且已经准备好像专业人士一样迎接这一挑战! 它带有 Drupal 8 的优点,去掉了旧代码,使其更精简、更简洁、更强大。 探索更多关于绝对有效的 Drupal 9 性能改进技术。

网站的性能是企业成功的关键。 缓慢加载网站可能对企业有害。 性能更好的网站有助于更好的搜索引擎优化,提高访问者的转化率,并为访问者提供更好的用户体验,从而共同促进业务增长。 而缓慢加载的网站则恰恰相反,并成为业务失败的原因。

drupal-9-性能优化


影响网站性能的因素有很多。 他们之中有一些是:

• 您的服务提供商(托管、DNS 等)
• 对服务器的请求数
• 技术问题或糟糕的编程实践
• 缓存技术
• 不正确的服务器配置
• 重图像和视频文件

Drupal 9 核心和自定义模块以提高性能

Drupal 9 中有许多可用的贡献和核心模块,它们可以帮助提高您网站的性能。 通过遵循某些编码实践并使用适当的服务器配置,您可以显着提高站点性能。

核心模块

• 大管道

Drupal Big Pipe 模块无需额外配置即可使事情变得更快。 它与 Drupal 核心打包在一起。 它通过使用可缓存元数据来提高前端感知性能,从而改进渲染管道。

• 内部动态页面缓存

这个 Drupal 9 模块有助于缓存动态内容。 它对匿名和经过身份验证的用户都有帮助。 该模块在 Drupal 7 中不可用。用户请求的页面在第一次请求时被存储,然后可以在进一步请求同一页面时重复使用。


• 内部页面缓存

内部页面缓存模块有助于为匿名用户缓存数据。 此模块在核心中可用,默认情况下处于启用状态。

配置路径:admin/config/development/performance

在这里您可以清除缓存、设置浏览器和代理缓存最大年龄以及启用/禁用聚合设置。

Advagg-module
内部页面缓存模块

贡献的模块

  • 高级 CSS/JS 聚合

    Advagg 模块包含许多其他子模块,例如 -
  • AdvAgg Cdn:帮助从公共 CDN 加载资产 (CSS/JS)
  • AdvAgg CSS/JS Validator:验证 CSS 和 JS 文件
  • AdvAgg 外部缩小器:使用命令行缩小器缩小 Javascript 和/或 CSS。
  • AdvAgg Minify CSS:帮助使用第 3 方缩小器缩小 css 文件
  • AdvAgg Minify JS:帮助使用 3rd 方 mi 缩小 js 文件
  • AdvAgg 修饰符:允许修改 CSS 和 JS 数组。 (可能有兼容性问题)
  • AdvAgg 旧版 Internet Explorer 兼容性增强器

配置路径: /admin/config/development/performance/advagg

该模块还支持文件压缩技术,如gzipbrotli 。 该模块有助于减少 http 请求的数量,从而显着提高站点性能。

  • 炽热的

Drupal 9 Blazy 模块提供延迟加载图像以节省带宽并避免更高的跳出率。 延迟加载是一种仅在用户可见区域加载图像的技术。 这种多服务技术可节省时间和数据。

配置路径: /admin/config/media/blazy

在这里,您可以启用/禁用 Blazy,配置占位符效果,还可以设置偏移量,该偏移量决定了图像对用户可见的时间。

炽热模块

炽热模块
  • CDN

Drupal 9 CDN 模块有助于在 Drupal 网站中轻松集成 CDN。 它有助于从 CDN 服务器提供静态内容,以提高内容交付速度。 除此之外,这个模块也很容易配置。

配置路径: /admin/config/services/cdn

CDN-模块
CDN 模块设置

在这里您可以启用/禁用 CDN、提供映射 URL 和选中/取消选中永久文件缓存。

通过最佳编码实践提高性能

  • 在 array_key_exist() 上使用 isset()

isset()方法明显快于array_key_exist()issetarray_key_exist之间的主要区别在于array_key_exists肯定会告诉你一个键是否存在于数组中。 而isset只会在键/变量存在且不为空时返回 true。 有关此检查的更多信息,请单击此处进行基准比较。

  • 使用 entityQuery()

entityQuery()依赖于存储控制器来处理构建和执行对适当实体存储的查询。 这样做的优点是任何通过entityQuery()运行的查询都是独立于存储的。 因此,如果您正在编写一个贡献的模块或在网站上工作,并且将来可能需要移动到替代实体存储,那么您的所有查询都将透明地使用新的存储后端,无需任何更改。 entityQuery()是否可以使用你的手在写查询中的自定义代码或通过entityQuery()的意见后端。

  • 使用 loadMultiple() 方法而不是循环

如果您有 10 个 nid(节点 id)并且您正在循环加载每个节点,那么您将对数据库进行 10 次查询。 在使用loadMultiple() 时,它被简化为一个数据库查询。

  • 缓存

使用 Drupal 9 中的缓存 API,您可以缓存渲染器、响应数组或对象。 Drupal 9 中提供了三种可渲染性缓存元数据。

  1. 缓存标签

    当数据依赖于 Drupal 实体或配置时,Cache 标签用于缓存数据。 其语法是cache-item:identifier 例如节点:5,用户:3。
  2. 缓存上下文

    句法:
    • 将父母与孩子分开的时期
    • 多个命名的缓存上下文表示可以指定一个参数; 使用:附加一个冒号
    示例: user.roles、user.roles:anonymous 等。
  3. 缓存最大年龄

Cache max-age 用于缓存时间敏感的数据。

  • 队列工作者/批次

处理大量数据且没有 php 超时,可以使用批处理或队列工作者。 queue worker 中的项目仅在 cron 运行时运行,并且它运行了一小段时间。 有两种类型的队列工作者:可靠的和不可靠的。 可靠队列工作者确保队列中的项目至少运行一次,而不可靠队列可能会因内存故障或其他中断而跳过项目。 批处理处理项目,直到所有项目在批处理条件下完成,以便在处理过程中不会发生错误,而无需等待 cron 运行。

通过更好的服务器配置提高性能

  • 使用 Nginx 而不是 Apache

Nginx 和 Apache 都是广泛使用的 Web 服务器。 Nginx 在性能基准上优于 Apache。 它也比 apache 更快、更高效。 根据运行多达 1,000 个同时连接的基准测试,Nginx 的执行速度是 Apache 的 2.5 倍。

  • HTTP/2.0 优于 HTTP/1.1

HTTP/2.0 支持多路复用,这与阻塞其他资源的 HTTP/1.1 不同。 如果一个资源无法加载,HTTP/2.0 使用 TCP 连接一次发送多个流数据。 HTTP/2.0 使用了比 HTTP/1.1 先进的头压缩技术

HTTP/2.0 的 Nginx 配置
服务器 {
    听 443 ssl http2; //http2设置
    ssl_certificate server.crt;
    ssl_certificate_key server.key;
}
  • 提供压缩内容

压缩响应通常会显着减少传输数据的大小。 然而,由于压缩发生在运行时,它也会增加大量的处理开销,这会对性能产生负面影响。 
用于提供压缩内容的 Nginx 配置:
服务器 {
    gzip 上;
    gzip_static 开启;    
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_proxyed 任何;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;    
    ...
}
  • MariaDB 代替 MySQL

与 MySQL 相比,mariaDB 的速度有所提高。 它提供比 MySQL 更快的缓存和索引。 在这种情况下,它比 MySql 快近 24%。 mariaDB 在其他一些关键指标上也优于 MySQL。 因此,就性能而言,MariaDb 优于 MySQL。

  • CDN

CDN 代表内容交付网络。 它是遍布全球的服务器集群(又名,存在点或 PoP),它们协同工作以更快地交付内容。 CDN 存储站点内容的缓存版本并从最近的可用服务器传送内容。 一些流行的 CDN 提供商是 Cloudflare、Amazon cloudfront、Google Cloud CDN 等。