在 Apache 上使用 Brotli 提供预压缩内容

问题描述 投票:0回答:3

我已经通过 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 找不到任何进一步的帖子或文档

apache include compression virtualhost brotli
3个回答
1
投票

只需暂时删除对

/etc/apache2/conf.2/brotli.conf
的引用并重新启动 Apache,您应该会看到预压缩的 brotli 文件仍然以 brotli 压缩的方式交付,而动态压缩文件(例如,不存在预压缩文件的 HTML、CSS 或 JS)则为现在根本没有压缩。


1
投票

配置 Apache 以提供预压缩的 Brotli 文件:

  1. 确保 brotli 压缩文件位于相应文件夹中的普通文件旁边。例如,如果您有一个文件 /var/www/html/index.html ,那么也应该有 /var/www/html/index.html.br

  2. 将以下内容添加到右侧的 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'

1
投票

我迟到了,但在我通过 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 文件的静态方式,则必须继续搜索。

© www.soinside.com 2019 - 2024. All rights reserved.