Apache では、以下のような設定を行うことでオンザフライ gzip 圧縮送信を有効にできます。
画像などのアセットや CSS / JavaScript を gzip 圧縮して送信することで、 転送量の削減やレスポンス速度の改善が期待できます。
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/x-javascript
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
各設定の意味は以下の通りです。
-
AddOutputFilterByType DEFLATE 指定した MIME タイプのレスポンスを gzip 圧縮する(mod_deflate による動的圧縮)
-
SetOutputFilter DEFLATE すべての出力を圧縮対象とする
-
SetEnvIfNoCase Request_URI … no-gzip dont-vary 画像など既に圧縮されている形式は圧縮しない(効率のため)
-
Header append Vary User-Agent env=!dont-vary 圧縮対応/非対応ブラウザの違いによるキャッシュ混在を防ぐため
Vary: User-Agentヘッダを追加
なお、前提として mod_deflate モジュールがロードされている必要があります。
# /etc/httpd/conf.modules.d/00-base.conf
LoadModule deflate_module modules/mod_deflate.so
Nginx ではオンザフライ gzip 圧縮送信が使えるか?
デフォルト状態で確認
まずは Nginx をインストールした直後の状態で確認してみます。
curl -H "Accept-Encoding: gzip" -I https://example.com/
レスポンスヘッダに以下が含まれていないため、 gzip 圧縮は有効になっていないことが分かります。
Content-Encoding: gzip
Vary: Accept-Encoding
設定を変更して再度確認
以下の設定を追加します。
# --- Gzip compression (on-the-fly) ---
gzip on; # gzip 圧縮を有効化
gzip_comp_level 6; # 圧縮率(1:速い〜9:高圧縮)
gzip_min_length 256; # 小さすぎるレスポンスは圧縮しない
gzip_vary on; # Vary: Accept-Encoding を追加
gzip_proxied any; # Proxy 経由の応答も圧縮
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/x-javascript
application/json
application/xml
image/svg+xml;
gzip_disable "msie6"; # 古いブラウザを除外
設定のポイント:
-
gzip on;gzip 圧縮を有効化 -
gzip_comp_level 6;圧縮率(Apache の mod_deflate と同等なら 5〜6 が目安) -
gzip_min_length 256;小さすぎるレスポンスは圧縮しない -
gzip_typesHTML 以外に圧縮対象とする MIME タイプを指定 -
gzip_vary on;キャッシュ整合性のためVary: Accept-Encodingを追加
設定を反映します。
nginx -t
systemctl reload nginx
動作確認
curl -H "Accept-Encoding: gzip" -I https://example.com/
レスポンスヘッダに以下が含まれていれば、gzip 圧縮が有効になっています。
Vary: Accept-Encoding
Content-Encoding: gzip
まとめ
Apache で行っていたオンザフライ gzip 圧縮送信は、Nginx においても同様に設定可能であることが確認できました。