2026年9月8日

2026年9月8日

WordPressのApacheでmod_deflateを使ってテキスト圧縮を有効化する設定

ApacheでWordPressのHTMLやCSS、JavaScriptを圧縮して返すには、mod_deflate を有効にし、AddOutputFilterByType DEFLATE で圧縮するMIMEタイプを指定します。この記事では、モジュールが使えるかの確認、サーバー設定と .htaccess それぞれの書き方、圧縮してはいけないファイル、キャッシュプラグインとの関係、curl での確認方法までを説明します。読み終えると、PageSpeed Insightsで指摘される「テキスト圧縮」を自分で設定し、効いていることを確かめられるようになります。

mod_deflateで何が変わるのか

mod_deflate は、Apacheがレスポンスを送る直前にgzip形式で圧縮する出力フィルターです。ブラウザはリクエストの Accept-Encoding ヘッダーで対応する圧縮形式を伝え、Apacheは対応していれば圧縮し、Content-Encoding: gzip を付けて返します。

HTMLやCSS、JavaScript、JSON、SVGのようなテキストは繰り返しが多いため、圧縮すると転送量が数分の一になることも珍しくありません。特にモバイル回線では、ダウンロード時間の短縮が表示の速さにつながります。一方、JPEGやPNG、WebP、WOFF2フォントはもともと圧縮された形式なので、再圧縮してもほとんど小さくならず、CPUを無駄に使うだけです。

作業前に確認すること

まず、すでに圧縮されているかを調べます。多くのレンタルサーバーやマネージドホスティングでは、最初から圧縮が有効になっています。

curl -s -o /dev/null -D - -H "Accept-Encoding: gzip" https://example.com/ | grep -iE "content-encoding|vary|server"

content-encoding: gzip(または br)が表示されれば、すでに圧縮されています。この場合、設定を追加する必要はありません。

server: の行も確認してください。LiteSpeedやNginxで動いているサーバーでは、Apache向けの mod_deflate の設定がそのまま効くとは限りません。また、Cloudflareなどのプロキシを経由している場合、ブラウザに届く圧縮はプロキシ側で行われていることがあり、オリジンの設定とは別に考える必要があります。

設定ファイルを変更する前に、/etc/apache2/(RHEL系では /etc/httpd/)とサイトの .htaccess をバックアップし、ステージング環境で試してから本番に反映してください。

ステップ1:mod_deflateを有効にする

サーバーの管理者権限がある場合は、モジュールが読み込まれているか確認します。

# Debian / Ubuntu
apachectl -M 2>/dev/null | grep -E "deflate|filter"

# RHEL / AlmaLinux / Rocky Linux
httpd -M 2>/dev/null | grep -E "deflate|filter"

deflate_module と filter_module が表示されれば読み込まれています。Apache 2.4では AddOutputFilterByType は mod_filter が提供しているため、両方が必要です。

Debian系で表示されない場合は、次のコマンドで有効にします。RHEL系では、通常 /etc/httpd/conf.modules.d/ の設定ファイルで最初から読み込まれています。

sudo a2enmod deflate
sudo apachectl configtest && sudo systemctl reload apache2

ステップ2:圧縮するMIMEタイプを指定する

サーバー設定(バーチャルホストや conf-available 配下)に書けるなら、そちらを使います。.htaccess はリクエストのたびに読み込まれるため、管理者権限があるならサーバー設定のほうが効率的です。

# /etc/apache2/conf-available/compression.conf
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
    AddOutputFilterByType DEFLATE text/javascript application/javascript application/json
    AddOutputFilterByType DEFLATE application/xml application/rss+xml application/atom+xml
    AddOutputFilterByType DEFLATE image/svg+xml image/x-icon
    AddOutputFilterByType DEFLATE font/ttf font/otf application/vnd.ms-fontobject

    # 圧縮率(1〜9)。サーバー設定とバーチャルホストでのみ指定できる
    DeflateCompressionLevel 6
</IfModule>
sudo a2enconf compression
sudo apachectl configtest && sudo systemctl reload apache2

JavaScriptは、Apacheのバージョンや mime.types によって application/javascript と text/javascript のどちらで送られるかが異なるため、両方を書いておきます。WordPressのRSSフィードは application/rss+xml、REST APIは application/json で返るので、これらも対象にしています。

DeflateCompressionLevel は数字を上げるほど小さくなりますが、CPUの負荷も増えます。差は大きくないため、中間の値で十分です。

mod_deflate は、圧縮したレスポンスに Vary: Accept-Encoding を自動で付けます。これにより、中継するキャッシュが「圧縮版」と「非圧縮版」を取り違えずに済みます。

ステップ3:.htaccessに書く場合

レンタルサーバーなどでサーバー設定を触れない場合は、WordPressのルートにある .htaccess に書きます。書く場所は、# BEGIN WordPress から # END WordPress の外にしてください。この区間はパーマリンク設定の保存時などにWordPressが書き換えるため、中に書くと消えることがあります。

# BEGIN Text Compression
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
    AddOutputFilterByType DEFLATE text/javascript application/javascript application/json
    AddOutputFilterByType DEFLATE application/xml application/rss+xml application/atom+xml
    AddOutputFilterByType DEFLATE image/svg+xml image/x-icon
</IfModule>
# END Text Compression

# BEGIN WordPress
# (WordPressが管理する部分。ここは編集しない)
# END WordPress

.htaccess では DeflateCompressionLevel を指定できないため省いています。.htaccess で AddOutputFilterByType を使うには、サーバー側で AllowOverride に FileInfo が許可されている必要があります。許可されていないと500エラーになることがあるので、保存したらすぐにサイトを開いて表示を確認し、エラーになれば元のファイルに戻してください。<IfModule> で囲んでいるのは、モジュールが無い環境でもエラーにしないためです。

古い解説記事にある BrowserMatch ^Mozilla/4 などの古いブラウザ向けの記述は、現在のブラウザでは不要です。

キャッシュプラグインやPHPの圧縮との関係

WP Super CacheやW3 Total Cacheなどのキャッシュプラグインには、圧縮関連の設定を .htaccess に書き込んだり、圧縮済みのキャッシュファイルを作ったりする機能を持つものがあります。また、PHPの zlib.output_compression を有効にしている環境もあります。

mod_deflate は、すでに Content-Encoding が付いたレスポンスは圧縮し直さないため、通常は二重に圧縮されることはありません。ただ、複数の場所で設定していると、問題が起きたときにどこが効いているのか分かりにくくなります。圧縮はApacheかプラグインのどちらか一方に寄せ、もう一方は無効にしておくと管理しやすくなります。

さらに小さくしたい場合は、Apache 2.4.26以降で使える mod_brotli によるBrotli圧縮もあります。対応状況はサーバーによるため、まずgzipで動作を固めてから検討するのが順当です。

圧縮が効いているか確かめる

設定後、もう一度ヘッダーを確認します。HTMLだけでなく、CSSとJavaScriptも1つずつ確かめてください。

URL=https://example.com/wp-includes/css/dist/block-library/style.min.css
curl -s -o /dev/null -D - -H "Accept-Encoding: gzip" "$URL" | grep -i content-encoding
# 圧縮あり・なしのサイズを比べる
curl -s -H "Accept-Encoding: gzip" "$URL" | wc -c
curl -s "$URL" | wc -c

ブラウザでは、開発者ツールの「ネットワーク」タブでファイルを選び、レスポンスヘッダーに content-encoding があるかを見ます。PageSpeed Insightsでは、テキスト圧縮についての指摘が消えているかを確認します。Lighthouseのバージョンによって項目名や分類が変わることがあるため(2026年10月現在)、項目の名前よりも「圧縮されていないテキストリソース」が挙がっていないかを見てください。

効いていない場合は、次の順で確かめます。

  1. content-encoding が無い:モジュールが読み込まれていない、または .htaccess の設定が許可されていない可能性があります。ステップ1の確認と、Apacheのエラーログを見ます。
  2. HTMLだけ圧縮されない:ページキャッシュのファイルを直接返す設定になっていて、そちらのルールが先に効いている場合があります。プラグインの圧縮設定を確認します。
  3. 設定を変えても変化がない:Cloudflareなどのキャッシュや、ブラウザのキャッシュに古いレスポンスが残っています。キャッシュを削除してから確かめます。

まとめ

  • mod_deflate はテキスト系のレスポンスをgzipで圧縮する出力フィルターで、Apache 2.4では mod_filter と組み合わせて AddOutputFilterByType DEFLATE で対象を指定します。
  • 作業前に curl で現状を確認します。すでに圧縮されていれば設定は不要で、LiteSpeedやプロキシ経由の環境では別の設定が効いていることがあります。
  • 対象はHTML・CSS・JavaScript・JSON・XML・SVGなどのテキストに限り、画像やWOFF2は含めません。
  • .htaccess に書くときは # BEGIN WordPress の外に置き、DeflateCompressionLevel はサーバー設定でのみ指定します。
  • 圧縮はApacheかキャッシュプラグインのどちらかに寄せ、設定後はCSSやJavaScriptも含めて content-encoding を確かめます。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲