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

时间:2018-04-11 13:16:00

标签: apache include compression virtualhost brotli

我已经通过easyapache 4在我的WHM服务器上安装了mod_brotli - html,css,js文件等都被压缩了。

然后我在社交文档中遇到了这个问题 - https://httpd.apache.org/docs/2.4/mod/mod_brotli.html#precompressed

我已将此添加到WHM中的Post VirtualHost包含文件(post_virtualhost_global.conf)而不是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上找不到任何进一步的帖子或文档

3 个答案:

答案 0 :(得分:1)

我参加聚会很晚,但是在Brotli通过Apache崩溃的过程中,OP不可能实现。

Apache文档显示的是如何正确地为文件“ if”提供预压缩的文件,从而提供文本:“ if它们存在”。

根据我搜集的内容以更好地理解这一点,Apache实际上无法对其进行预压缩,这必须通过超出Apache范围的二进制文件或扩展名来实现。

Apache mod_brotli为您执行的操作是在发送请求时动态地动态压缩请求。对于OP,使用cPanel,如果启用了mod_brotli,则EasyApache4将添加必要的位,以服务和压缩 AddOutputFilterByType 中概述的文件作为Brotli。同样,这些是动态提供的。即时生成并投放。据我所知,它们被缓存在内存中而不是磁盘上。

启用mod_brotli是启用brotli的简便方法,但是由于必须压缩所有流经Apache的请求的开销和性能,因此最好预先压缩用作OP的文件。我遇到了一个博客,他们谈论这个问题,动态与静态之间的区别值得使用静态预压缩文件,但是,如果您的网站很小,或者是一个真正强大的托管平台,那么动态服务可能就可以了你。

如果我没记错的话,只要您能找到一种方法来预压缩.br,您甚至不需要启用mod_brotli即可提供预压缩的.br文件。

以下是使用PHP预压缩文件的示例:https://github.com/kjdev/php-ext-brotli

到目前为止,还没有人以可行的方式来回答OP,以将文件预压缩为Brotli(因为我也在搜索此文件),但我需要指出的是Apache并未进行预压缩如果您要寻找一种静态的方式来提供Brotli .br文件,就必须继续搜索。

答案 1 :(得分:0)

暂时删除对/etc/apache2/conf.2/brotli.conf的引用并重新启动Apache,您应该会看到预压缩的brotli文件仍然使用brotli压缩,而动态压缩文件(例如HTML或CSS或JS,其中预压缩文件执行现在还没有压缩。

答案 2 :(得分:0)

要将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,然后grep在您的apache错误日志中重写语句

tail -f /var/log/apache2/error.log | grep '[rewrite'