Обслуживание предварительно сжатого контента с Brotli на Apache
Я установил mod_brotli на свой WHM-сервер через easyapache 4 - html, css, js файлы и т. Д. Все сжимаются.
Затем я столкнулся с этим в неофициальных документах - https://httpd.apache.org/docs/2.4/mod/mod_brotli.html
С тех пор я добавил это в мой включаемый файл Post VirtualHost в WHM (post_virtualhost_global.conf) вместо htaccess, так как я хочу, чтобы это было на всем сервере.
Как я могу убедиться, что это работает и действительно обслуживает предварительно сжатые файлы? Я не нашел ничего, чтобы сказать в любом случае, я могу только подтвердить, что используется сжатие brotli. Загрузка ЦП практически одинакова с включением или без него, поэтому я подозреваю, что в следующий раз сжатые файлы могут быть не сохранены.
Это виртуальный хост включает в себя:
<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
4 ответа
Чтобы настроить 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 и затем grep для операторов перезаписи в вашем журнале ошибок apache
tail -f /var/log/apache2/error.log | grep '[rewrite'
Я опаздываю на вечеринку, но в моем ускоренном курсе Brotli через Apache 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
До сих пор никто не ответил на OP о жизнеспособных способах предварительного сжатия файлов как Brotli (поскольку я тоже ищу это), но мне нужно указать, что Apache не выполняет предварительное сжатие, и вы Если вы ищете статический способ обслуживания файлов Brotli .br, вам придется продолжить поиск.
Просто удалите ссылку на /etc/apache2/conf.2/brotli.conf
временно и перезапустите Apache, и вы должны увидеть, что ваши предварительно сжатые файлы brotli по-прежнему доставляются со сжатием brotli, тогда как динамически сжатые файлы (например, HTML или CSS или JS, где предварительно сжатый файл не существует) теперь вообще не сжимаются.
Чтобы это работало на виртуальном хосте, следует использовать предварительный просмотр, чтобы получить абсолютный путь к файлу, с которым сопоставлен запрос.
<VirtualHost *:8080>
<Files *.html.br>
AddType "text/html" .br
AddEncoding br .br
</Files>
<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>
RewriteEngine On
RewriteCond %{HTTP:Accept-Encoding} br
RewriteCond %{LA-U:REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1.br [L]
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/opt/homebrew/opt/httpd/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog "/opt/homebrew/var/log/httpd/dummy-host.example.com-error_log"
CustomLog "/opt/homebrew/var/log/httpd/dummy-host.example.com-access_log" common
</VirtualHost>