Joomla 性能优化 II:基本设置
在本系列的第一部分中,我描述了为什么从哲学和实用的角度来说,你应该优化你站点的性能。我还说明了从哪里开始。那篇文章是必要的,但有点泛泛而谈。在本系列的第二部分中,我们将深入了解你在 Joomla 中可以做的某些基本事情,以解锁相当多的性能。
基本系统设置
在构建网站时,我们往往被设计和功能所吸引,忘记了某些非常基本且相当直观的系统设置对我们的站点性能有很大的影响。在交付网站之前,在全局配置中进行一些简单的开关操作,以及一些简单的服务器检查,可以在世界上产生巨大的差异。
缓存
在网站的服务器端的大部分时间都花在构建将要显示给访客的页面上了。与 WordPress 不同,Joomla 具有内置的缓存系统。我觉得人们没有给予它足够的认可,因为他们习惯了 Joomla 1.0 和 1.5 中的低级缓存体验。那是在 10 到 15 年前。
前往您站点的全局配置,并将缓存设置为“开启 - 渐进式缓存”。渐进式缓存选项是 Joomla 内置缓存的更好实现,确保用于构建您页面的每个扩展的输出都被单独缓存。当请求到来时,如果可能,页面将从这些缓存内容片段中拼接而成。这甚至可以帮助减轻由于预构建的非优化模板而造成的某些性能损失。它肯定会加快您公共的、非登录的页面的速度——这正是您站点搜索引擎排名最相关的。
关于缓存后端,大多数网站可以使用文件缓存,其性能与运行在良好、商业、共享或虚拟化主机上的memcached或Redis相当——内存使用量少得多,因此运行成本更低。“异端!”你们中技术意识更强的人可能会喊道。我在某种程度上同意你的感受。如果你有一个真正巨大或非常繁忙的网站,使用专门的memcached或Redis服务器作为你的缓存后端是有意义的。它确实会更快。如果你在读这篇文档,那么你实际上并没有这样的网站,你只是在试图加快一个更常见的网站。即使我的业务网站也属于这一类,尽管我们的流量达到了数十万独特的月访问量。这应该给你一个关于使用专用缓存服务器进行缓存能够受益的网站规模的感观。
HTML压缩
如果有一个关于Joomla中最被忽视的选项的比赛,Gzip页面压缩将会毫无悬念地获胜。如果你还没有这样做,请继续启用它。
此选项确保您网站发送给浏览器的HTML内容使用GZip(也称为“deflate”)算法进行压缩。这大大减少了发送到客户端的数据总量。在数据传输中节省的时间对您网站的性能有显著影响。
它不会减慢网站吗?不,实际上不会。Joomla生成的HTML页面的大小在几十个千字节范围内。将其压缩到大约三分之一到一半的大小只需要极短的时间。在主机和您的访问者之间的典型传输速度下,这相当于节省了几个毫秒的时间。在这种情况下,你获得的时间比损失的时间多出两个到三个数量级。
JavaScript和CSS压缩
许多模板和第三方插件声称通过即时压缩您的静态文件(JavaScript和CSS)来节省时间。我强烈建议您不要使用此类功能。虽然压缩静态文件确实节省了传输时间,但你最终会以净性能损失告终。
这种反直觉的结果的原因需要讨论服务器如何交付静态和动态内容。一个正确设置的Web服务器会在内存中缓存经常使用的静态内容。此外,它使用操作系统的先进功能,如文件的内存映射。这些导致静态内容的快速交付。
当你使用PHP脚本来压缩你的静态文件时,Web服务器必须将请求交给PHP可执行文件。在最佳情况下(PHP FastCGI Process Manager即PHP-FPM,有足够的进程池并且PHP OPcache已启用),这仍然会浪费一些时间进行进程间通信和重置PHP解析器的状态。脚本需要确认未改变,加载其预编译的二进制表示并解释,由PHP二进制执行,静态文件需要打开,其内容压缩并发送到Apache以交付给客户端。所有这些都需要几十毫秒。除非你压缩的文件大小超过几百千字节,否则你损失的时间比通过交付更小的压缩文件获得的时间要多——一个或两个数量级!因此,这是一个净损失。
我强烈建议通过您的Web服务器本身来做这件事。如果您使用Apache,您可以将以下内容添加到您的.htaccess文件中
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain text/xml text/css application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript image/svg+xml </IfModule> <IfModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_keep_workfiles No mod_gzip_can_negotiate Yes mod_gzip_add_header_count Yes mod_gzip_send_vary Yes mod_gzip_min_http 1000 mod_gzip_minimum_file_size 300 mod_gzip_maximum_file_size 512000 mod_gzip_maximum_inmem_size 60000 mod_gzip_handle_methods GET mod_gzip_item_include file \.(html?|txt|css|js|php|pl|xml|rb|py|svg|scgz)$ mod_gzip_item_include mime ^text/plain$ mod_gzip_item_include mime ^text/xml$ mod_gzip_item_include mime ^text/css$ mod_gzip_item_include mime ^application/xml$ mod_gzip_item_include mime ^application/xhtml+xml$ mod_gzip_item_include mime ^application/rss+xml$ mod_gzip_item_include mime ^application/javascript$ mod_gzip_item_include mime ^application/x-javascript$ mod_gzip_item_include mime ^image/svg+xml$ mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include handler ^server-status$ mod_gzip_item_include handler ^server-info$ mod_gzip_item_include handler ^application/x-httpd-php mod_gzip_item_exclude mime ^image/.* </IfModule>
您的Web服务器在压缩静态媒体文件方面要快得多。它可以在内存中缓存压缩文件,以便下次更快地交付。
Joomla 4 还通过允许您在提前使用 GZip 对静态文件进行压缩来提高竞争力,从而发送预压缩的文件而不是让您的 Web 服务器按需压缩。它的工作原理是这样的。假设您有一个 JavaScript 文件 media/com_example/js/something.min.js
。使用 GZip 压缩成 media/com_example/js/something.min.js.gz
。当浏览器请求 media/com_example/js/something.min.js
文件时,Web 服务器会检查其 Accepts
HTTP 标头,看它是否支持 GZip 压缩的资源。如果是的话,它将发送 media/com_example/js/something.min.js.gz
文件,而不是常规的未压缩 media/com_example/js/something.min.js
文件。
实现这一点的先决条件是,您需要将 Joomla 随带提供的 htaccess.txt
文件重命名为 .htaccess
。或者,如果您正在管理自己的 .htaccess 文件,请确保您的文件中包含以下代码
## These directives are only enabled if the Apache mod_headers module is enabled. ## This section will check if a .gz file exists and if so will stream it ## directly or fallback to gzip any asset on the fly ## If your site starts to look strange after enabling this, and you see ## ERR_CONTENT_DECODING_FAILED in your browser console network tab, ## then your server is already gzipping css and js files and you don't need this ## block enabled in your .htaccess <IfModule mod_headers.c> # Serve gzip compressed CSS files if they exist # and the client accepts gzip. RewriteCond "%{HTTP:Accept-encoding}" "gzip" RewriteCond "%{REQUEST_FILENAME}\.gz" -s RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA] # Serve gzip compressed JS files if they exist # and the client accepts gzip. RewriteCond "%{HTTP:Accept-encoding}" "gzip" RewriteCond "%{REQUEST_FILENAME}\.gz" -s RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA] # Serve correct content types, and prevent mod_deflate double gzip. RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1] RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1] <FilesMatch "(\.js\.gz|\.css\.gz)$"> # Serve correct encoding type. Header append Content-Encoding gzip # Force proxies to cache gzipped & # non-gzipped css/js files separately. Header append Vary Accept-Encoding </FilesMatch> </IfModule>
Joomla 4 在其发行版中为所有静态 JavaScript 和 CSS 文件提供了预压缩的 .gz 文件。启用此 .htaccess 技巧将使您的网站在最小努力下变得更快。太棒了,不是吗?!
静态媒体缓存
通过压缩减小静态媒体的大小是战斗的一半,主要针对首次访问者。当有人再次访问您的网站时,他们的浏览器从浏览器缓存中提供静态媒体是有意义的,而无需触及网络。如果您使用 Apache,您可以在您的 .htaccess 文件中使用以下代码
<IfModule mod_expires.c> # Enable expiration control ExpiresActive On # CSS and JS expiration: ExpiresByType text/css "now plus 1 year" ExpiresByType application/javascript "now plus 1 year" ExpiresByType application/x-javascript "now plus 1 year" # Image files expiration: 1 month after request ExpiresByType image/bmp "now plus 1 year" ExpiresByType image/gif "now plus 1 year" ExpiresByType image/jpeg "now plus 1 month" ExpiresByType image/jp2 "now plus 1 month" ExpiresByType image/pipeg "now plus 1 month" ExpiresByType image/png "now plus 1 month" ExpiresByType image/svg+xml "now plus 1 month" ExpiresByType image/tiff "now plus 1 month" ExpiresByType image/vnd.microsoft.icon "now plus 1 month" ExpiresByType image/x-icon "now plus 1 month" ExpiresByType image/ico "now plus 1 month" ExpiresByType image/icon "now plus 1 month" ExpiresByType image/webp "now plus 1 month" ExpiresByType text/ico "now plus 1 month" ExpiresByType application/ico "now plus 1 month" ExpiresByType image/vnd.wap.wbmp "now plus 1 month" ExpiresByType application/vnd.wap.wbxml "now plus 1 month" ExpiresByType application/smil "now plus 1 month" # Font files expiration: 1 week after request ExpiresByType application/vnd.ms-fontobject "now plus 1 week" ExpiresByType application/x-font-ttf "now plus 1 week" ExpiresByType application/x-font-opentype "now plus 1 week" ExpiresByType application/x-font-woff "now plus 1 week" ExpiresByType font/woff2 "now plus 1 week" ExpiresByType image/svg+xml "now plus 1 week" # Audio files expiration: 1 month after request ExpiresByType audio/ogg "now plus 1 month" ExpiresByType application/ogg "now plus 1 month" ExpiresByType audio/basic "now plus 1 month" ExpiresByType audio/mid "now plus 1 month" ExpiresByType audio/midi "now plus 1 month" ExpiresByType audio/mpeg "now plus 1 month" ExpiresByType audio/mp3 "now plus 1 month" ExpiresByType audio/x-aiff "now plus 1 month" ExpiresByType audio/x-mpegurl "now plus 1 month" ExpiresByType audio/x-pn-realaudio "now plus 1 month" ExpiresByType audio/x-wav "now plus 1 month" # Movie files expiration: 1 month after request ExpiresByType application/x-shockwave-flash "now plus 1 month" ExpiresByType x-world/x-vrml "now plus 1 month" ExpiresByType video/x-msvideo "now plus 1 month" ExpiresByType video/mpeg "now plus 1 month" ExpiresByType video/mp4 "now plus 1 month" ExpiresByType video/quicktime "now plus 1 month" ExpiresByType video/x-la-asf "now plus 1 month" ExpiresByType video/x-ms-asf "now plus 1 month" </IfModule>
一个合理的问题是,如果您更新 Joomla 和/或第三方扩展会发生什么。静态文件——JavaScript、CSS、图像等——作为更新的一部分而更改。我们不希望浏览器使用旧文件。最坏的情况是,网站看起来会很奇怪,最坏的情况是,对访客来说会崩溃。这就是媒体版本化与查询参数发挥作用的地方。如果您查看您网站的源代码,您将看到如下行
<link href="/media/plg_system_webauthn/css/button.min.css?f15d039055248502c1a41bc99a31c0f3" rel="stylesheet">
这个 ?f15d039055248502c1a41bc99a31c0f3
被称为媒体版本化查询。问号之后的内容无关紧要,只要它在静态文件更改时更改即可。Joomla——以及正确编写的第三方扩展——会自动为 CSS 和 JavaScript 文件这样做。如果您在文章中包含其他静态内容,例如图像、视频等,请记住添加版本查询。像 ?20211205111300
(一个问号后跟年份、月份、日期、小时、分钟和秒——您编写查询的时间)就足够了。
HTTPS 和 HSTS
有一个普遍的误解,即 HTTPS 与保护您的网站有关,它是昂贵的,它是慢的,除非您正在做电子商务或类似的事情,否则您真的不需要它。另一个误解是它会使您的网站变慢。
这些神话起源于 20 世纪 90 年代末。二十多年前,它们显然是错误的。
如今,HTTPS 几乎是强制性的。如果您不使用 HTTPS,您的网站将出现一个大的、红色的警告,告诉您的访客它是不安全的,吓跑访客。它将被搜索引擎处罚。您应该使用 HTTPS,仅为了解决这两个问题。您甚至不需要打破你的存钱罐。TLS 证书现在免费,多亏了 Let's Encrypt。大多数托管控制面板与 Let's Encrypt 集成,这意味着您实际上可以让您的托管控制面板颁发和安装免费的 TLS 证书,并自动续订它。您不需要进行任何维护。由于过去十年多来发布的任何现代 CPU 都具有用于加密操作硬件加速,因此 HTTPS 也非常快。
在此期间,请记住在全局配置中设置“强制整个站点 HTTPS”。这确保了您的 Joomla 网站始终通过 HTTPS 交付,从而在过程中使登录更安全。一旦您这样做,并确认 HTTPS 与您的网站配合得很好,请将以下内容添加到您的 .htaccess 中
<IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=31536000" env=HTTPS </IfModule>
这启用了名为HSTS(HTTP严格传输安全)的功能。简而言之,它告诉您的浏览器永远不要尝试连接到您网站的HTTP版本,无论您的访客要求它做什么。由于这是在浏览器端发生的,因此那些在地址栏中输入您的域名而没有https://
前缀的访客,或者点击带有http://
前缀的链接,都将始终访问到您网站的HTTPS版本,而无需首先访问纯HTTP版本并由Joomla进行重定向。这在高速连接(如移动或卫星互联网)上尤其快速。
您还可以进行的一项进一步优化是将您的网站提交到HSTS预加载列表。虽然HSTS只有在某人第一次访问您的网站后才生效,但您的网站在HSTS预加载列表中意味着在您的访客第一次访问它之前,浏览器就已经知道您的网站使用HSTS。因此,浏览器将永远不会尝试通过纯HTTP加载它。同样,这对于高速连接来说节省了时间,而且容易且免费。这有什么不好呢?
HTTP/2服务器推送
在以前讨论如何使Joomla更快时,我告诉人们如何启用HTTP/2服务器推送来加快网站速度。然而,Google Chrome的开发者已经提出了移除对其支持的建议,并表示它将根本不会在HTTP/3协议中实施。因此,我现在的建议是甚至不要费心去考虑它。
待续
这是五部分系列的第二部分。第三部分:静态媒体优化将在2022年1月的Joomla社区杂志中提供。
本文的德语翻译:https://www.jug-zueri.ch/artikel/performance-tuning-in-joomla-teil-2-grundeinstellungen
在Joomla社区杂志上发表的一些文章代表作者对特定主题的个人观点或经验,可能与Joomla项目的官方立场不一致
版权
© 版权所有 ©2020–2021 Nikolaos Dionysopoulos。保留所有合法权利。
通过接受,您将访问由 https://magazine.joomla.net.cn/ 之外的第三方提供的服务的链接
评论 7
感谢尼古拉斯,好文章!
感谢你对Joomla社区做出的卓越、高水平的、重要的和持久的贡献。
非常实用的文章尼古拉斯——谢谢您!
不确定是否有人会看到几乎一年前的文章的评论,但谁知道呢。
最近,我发现了一些信息称,对动态生成的内容进行压缩是不安全的,并且容易受到CRIME和BREACH攻击。我想这个漏洞仅适用于包含敏感内容的页面,但我仍然很好奇尼古拉斯对此有何看法,与“HTML压缩”这一部分相关?
与其阅读维基百科上过于简化的版本,不如阅读实际的CVE https://www.cve.org/CVERecord?id=CVE-2012-4929。这是TLS 1.2及更早版本中的一个实现问题。因此,需要一个过时的TLS版本,即一个十年前就有缺陷并被修复的版本(请注意,缺陷要求是为什么nginx不受影响),以及一个在良好时间测量下发起数千次请求的中间人攻击(这排除了现代浏览器中的JavaScript和浏览器扩展)。BREACH需要一个9年前未修复的gzip库。我认为,如果你使用的是未能满足安全最佳实践、10年内未更新且处于受损害网络上的东西,那么CRIME和BREACH攻击就不是你最关心的问题了。
不,我不会在服务器级别关闭压缩以“缓解”在十年前TLS协议实现中已经解决的问题,并且在TLS 1.3(自2018年以来一直是当前TLS版本)中肯定已经解决的问题。
如果你想要变得偏执,你知道有确凿的攻击和关于从去认证的蓝牙键盘分析按键、测量未屏蔽(即几乎所有)USB键盘电缆的电磁场、分析打字声音或使用红外摄影分析按键热图的论文吗?(显然,用于更多键盘的ABS按键比PBT键帽更容易分析热图。)大多数相同的方法也适用于鼠标输入。在进行在线会议时,你的屏幕在眼镜上的反射可以分析出大约600x400像素分辨率的屏幕画面。你的电脑功率消耗的亚毫瓦变化可以用来推断你正在做什么,或者从空气隔离的电脑中泄露数据。如果你考虑针对电脑的所有可能攻击,你将得出一位前CIA局长的俏皮话:电脑只有在被撕碎、融化、压成粉末并埋在未知地点6英尺以下时才是安全的。但并不是我们都在用电脑处理绝密材料,这些材料的泄露可能会损害我国的安全或导致人类毁灭的热核战争。所以,我们不要因为对可能性和可能性反应过度而加入锡箔帽小队。
说到可能性和可能性,让我们谈谈安全的第一法则:昨天就更新一切。所有这些攻击都是众所周知的,并且在服务器软件和常见软件库中已经得到了缓解。只要使用最新的服务器环境,使用当前维护的软件的最新补丁级别,你就可以安全地使用压缩,并且从已知攻击向量中得到保护,相对安全。当然,你可能有一个尚未被发现的安全问题,或者至少是一个尚未公开的问题,但对此你能做的只有标准的安全实践,这主要是为了在成功攻击后进行事后分析。只要你的客户端在使用维护和更新的操作系统上的最新浏览器,且没有不安全或受损害的浏览器扩展,他们的一端也会安全。如果任一端仍在使用过时软件,那么双方最终都会有一个非常糟糕的一天。
感谢您的快速而全面的回复。非常感激。说实话,直到几天前同事提起这件事,我甚至不知道这个所谓的安全问题。当时认为这可能会对搜索引擎排名造成不良影响,但我还没有找到证据。至少我知道如果有人再次提起这个问题,我应该说什么,尽管很难用心记下这个复杂的报告
您可以给同事的最简单回答是:“这个问题出现在2012年,那时已经修复了。那已经是十年前的事情了。如果我们的服务器运行的是十年或更老的软件,这将是我们的最小担忧。”