最近終於接觸到 Google 釋出的 Brotli 壓縮技術
於是動念想幫 apache 也加上 brotli 的支援,因為現在各大瀏覽器也都已經支援
但因為微軟的 IE (Internet Explorer) 全系列都沒有支援
所以作法就變成增加 mod_brotli 的支援且優先使用,而不是取代 mod_deflate 或 mod_gzip
到 Apache 官方網站找了一下,官方是從 2.4.26 版才開始支援 mod_brotli
所以轉向 GitHub 找找有沒有釋出的解決方案,確實有:kjdev/apache-mod-brotli
接下來就是操作流程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 安裝依賴的套件 yum -y install libtool automake httpd-devel # git clone 最後一次 commit,且連同 submodule 一起 clone 回來 git clone --depth=1 --recursive https://github.com/kjdev/apache-mod-brotli.git cd apache-mod-brotli ./autogen.sh ./configure make # 編譯完成 # 安裝 install -p -m 755 -D .libs/mod_brotli.so /etc/httpd/modules/mod_brotli.so |
這樣就完成編譯與安裝囉
設定的部份,因為是要增加支援
所以設定值新增的位置一定要 放在 <IfModule mod_deflate.c> 前面
這樣若瀏覽器的送的 Accept-Encoding 若包含 br,就會優先使用 mod_brotli 來處理
否則就交由 mod_deflate 或 mod_gzip 處理
官方建議如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Load module LoadModule brotli_module modules/mod_brotli.so <IfModule brotli_module> # Output filter AddOutputFilterByType BROTLI text/html text/plain text/css text/xml # SetOutputFilter BROTLI # SetEnvIfNoCase Request_URI \.txt$ no-br # Compression ## BrotliCompressionLevel: 0-11 (default: 11) BrotliCompressionLevel 10 ## BrotliWindowSize: 10-24 (default: 22) BrotliWindowSize 22 # Specifies how to change the ETag header when the response is compressed ## BrotliAlterEtag: AddSuffix, NoChange, Remove (default: AddSuffix) BrotliAlterEtag AddSuffix # Filter note BrotliFilterNote Input brotli_in BrotliFilterNote Output brotli_out BrotliFilterNote Ratio brotli_ratio LogFormat '"%r" %{brotli_out}n/%{brotli_in}n (%{brotli_ratio}n)' brotli CustomLog logs/access_log brotli </IfModule> |
鸚鵡有稍微調整設定
- 增加一些 MIME Type
- 取消壓縮率相關資訊的定義
- 關閉 Log 相關設定
- 因為鸚鵡不使用 ETag,所以 BrotliAlterEtag 直接設定 Remove
這邊可以依據自己的需求調整
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# add support brotli LoadModule brotli_module modules/mod_brotli.so <ifmodule brotli_module> # Output filter AddOutputFilterByType BROTLI application/javascript application/rss+xml application/vnd.ms-fontobject AddOutputFilterByType BROTLI application/x-font application/x-font-opentype application/x-font-otf AddOutputFilterByType BROTLI application/x-font-truetype application/x-font-ttf AddOutputFilterByType BROTLI application/x-javascript application/xhtml+xml application/xml AddOutputFilterByType BROTLI font/opentype font/otf font/ttf AddOutputFilterByType BROTLI image/svg+xml image/x-icon AddOutputFilterByType BROTLI text/css text/html text/javascript text/plain text/xml # SetOutputFilter BROTLI # SetEnvIfNoCase Request_URI \.txt$ no-br # Compression ## BrotliCompressionLevel: 0-11 (default: 11) BrotliCompressionLevel 10 ## BrotliWindowSize: 10-24 (default: 22) BrotliWindowSize 22 # Specifies how to change the ETag header when the response is compressed ## BrotliAlterEtag: AddSuffix, NoChange, Remove (default: AddSuffix) BrotliAlterEtag Remove # Filter note #BrotliFilterNote Input brotli_in #BrotliFilterNote Output brotli_out #BrotliFilterNote Ratio brotli_ratio #LogFormat '"%r" %{brotli_out}n/%{brotli_in}n (%{brotli_ratio}n)' brotli #CustomLog logs/access_log brotli </IfModule> |
最後重新啟動 httpd 即可