我已经通过 easyapache 4 在我的 WHM 服务器上安装了 mod_brotli - html、css、js 文件等都被压缩了。
然后我在官方文档中遇到了这个 - https://httpd.apache.org/docs/2.4/mod/mod_brotli.html#precompressed
我已将其添加到 WHM (post_virtualhost_global.conf) 中的 Post VirtualHost 包含文件中,而不是 htaccess,因为我希望这是服务器范围内的。
我如何验证这是否有效并且确实提供预压缩文件?我还没有找到任何说法,我只能确认正在使用 brotli 压缩。无论是否包含包含,CPU 负载都接近相同,因此我怀疑它可能不会保存压缩文件以供下次使用。
这是虚拟主机包括:
<IfModule mod_headers.c>
# Serve brotli compressed CSS and JS files if they exist
# and the client accepts brotli.
RewriteCond "%{HTTP:Accept-encoding}" "br"
RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
RewriteRule "^(.*)\.(js|css)" "$1\.$2\.br" [QSA]
# Serve correct content types, and prevent double compression.
RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli:1]
RewriteRule "\.js\.br$" "-" [T=text/javascript,E=no-brotli:1]
<FilesMatch "(\.js\.br|\.css\.br)$">
# Serve correct encoding type.
Header append Content-Encoding br
# Force proxies to cache brotli &
# non-brotli css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
这是我的/etc/apache2/conf.2/brotli.conf
<IfModule brotli_module>
# Compress only a few types
# https://httpd.apache.org/docs/trunk/mod/mod_brotli.html
AddOutputFilterByType BROTLI_COMPRESS text/plain text/css text/html application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript
SetOutputFilter BROTLI_COMPRESS
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli
BrotliFilterNote Input instream
BrotliFilterNote Output outstream
BrotliFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' brotli
CustomLog "logs/brotli_log" brotli
</IfModule>
这是 /etc/apache2/conf.modules.d/115_mod_brotli.conf
# Enable mod_brotli
LoadModule brotli_module modules/mod_brotli.so
因此,如果有人可以帮助我弄清楚如何确认文件是否已预压缩,那就太好了。
编辑:我认为我的文件没有被预压缩。有人有这方面的进一步信息吗?我在 akk 找不到任何进一步的帖子或文档
只需暂时删除对
/etc/apache2/conf.2/brotli.conf
的引用并重新启动 Apache,您应该会看到预压缩的 brotli 文件仍然以 brotli 压缩的方式交付,而动态压缩文件(例如,不存在预压缩文件的 HTML、CSS 或 JS)则为现在根本没有压缩。
配置 Apache 以提供预压缩的 Brotli 文件:
确保 brotli 压缩文件位于相应文件夹中的普通文件旁边。例如,如果您有一个文件 /var/www/html/index.html ,那么也应该有 /var/www/html/index.html.br
将以下内容添加到右侧的 VirtualHost 配置中:
RewriteCond %{HTTP:Accept-Encoding} br
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}.br -f
RewriteRule ^(.*)$ $1.br [L]
<Files *.js.br>
AddType "text/javascript" .br
AddEncoding br .br
</Files>
<Files *.css.br>
AddType "text/css" .br
AddEncoding br .br
</Files>
<Files *.svg.br>
AddType "image/svg+xml" .br
AddEncoding br .br
</Files>
<Files *.html.br>
AddType "text/html" .br
AddEncoding br .br
</Files>
检查是否正在提供预压缩的 brotli 文件:
您可以记录重写以查看您的重写是否有效。如果这些正在运行,则说明您的预压缩 brotli 文件正在提供服务。在您的虚拟主机中,添加以下内容:
LogLevel alert rewrite:trace6
重新启动 apache2,点击 URL,然后在 apache 错误日志中 grep 查找重写语句
tail -f /var/log/apache2/error.log | grep '[rewrite'
我迟到了,但在我通过 Apache 进行的 Brotli 速成课程中,OP 是不可能的。
Apache 文档显示的是如何正确地提供文件“如果”它们是预压缩的,因此文本:“如果它们存在”。
为了更好地理解这一点,从我在搜索中收集到的信息来看,Apache 实际上无法预压缩文件,这必须通过超出 Apache 范围的二进制文件或扩展来完成。
Apache mod_brotli 为您所做的是动态在发送请求时实时压缩请求。对于 OP,使用 cPanel,如果启用 mod_brotli,EasyApache4 会添加必要的位来提供和压缩AddOutputFilterByType中概述的文件作为 Brotli。同样,这些都是动态提供的。即时生成并提供服务。据我所知,这些缓存在内存中而不是磁盘上。
启用 mod_brotli 是启用 brotli 的简单方法,但是最好预先压缩作为 OP 所需的文件,因为必须逐字压缩流经 Apache 的所有请求会产生开销和性能影响。我浏览过一个博客,他们在其中讨论了这一点,动态与静态之间的区别值得使用静态预压缩文件,但是如果您有一个小网站,或者可能是一个非常强大的托管平台,那么动态服务可能会很好地工作你。
如果我没记错的话,如果您能找到一种预压缩它们的方法,您甚至不需要启用 mod_brotli 来提供预压缩的 .br 文件。
以下是使用 PHP 预压缩文件的示例:https://github.com/kjdev/php-ext-brotli
到目前为止,没有人用 Brotli 那样的可行方法来预压缩文件(因为我也在寻找这个)来回答 OP,但我需要指出的是 Apache 不进行预压缩,而你如果您正在寻找提供 Brotli .br 文件的静态方式,则必须继续搜索。