Apacheで静的ファイルと動的コンテンツにgzipを適用する方法と設定例

Apacheを使用したWebサイトの高速化には、gzip圧縮の導入が効果的です。gzipはWebページのサイズを圧縮し、ユーザーに送信されるデータ量を削減することで、ページの読み込み速度を向上させます。これにより、帯域幅の節約やレスポンスの改善が期待でき、特にモバイル環境や低速な回線を利用するユーザーに対して効果を発揮します。

Apacheでは、静的ファイル(HTML、CSS、JavaScript)だけでなく、PHPやPerlなどの動的コンテンツにもgzip圧縮を適用することが可能です。mod_deflateモジュールを利用して簡単に設定できるため、多くのWebサーバーで標準的に採用されています。

本記事では、Apacheにおけるgzip圧縮の基本的な仕組みから、実際の設定例、静的ファイルや動的コンテンツへの適用方法、適用状況の確認方法までを詳しく解説します。これにより、Apacheを利用してWebサイトのパフォーマンスを最大限に引き出す方法が習得できます。

目次

gzip圧縮の概要とメリット


gzip圧縮は、Webサーバーがクライアント(ブラウザ)にデータを送信する際に、そのデータを圧縮してサイズを小さくする技術です。圧縮されたデータは、ブラウザ側で解凍されて表示されるため、通信量を削減し、ページの表示速度を向上させます。

gzip圧縮の仕組み


gzipは、テキストベースのファイル(HTML、CSS、JavaScriptなど)を圧縮することで、ファイルサイズを約70〜90%削減できます。圧縮されたデータは、HTTPレスポンスの「Content-Encoding: gzip」というヘッダーによって識別され、ブラウザが自動的に解凍します。

gzip圧縮の主なメリット

  1. ページ読み込み速度の向上
    ファイルサイズが小さくなることで、ページのダウンロード時間が短縮され、特にモバイル環境での閲覧が快適になります。
  2. 帯域幅の節約
    サーバーから送信されるデータ量が減少するため、帯域幅の消費を抑え、サーバーコストを削減できます。
  3. SEOの向上
    Googleなどの検索エンジンは、ページの表示速度をランキングの要素として評価します。gzip圧縮による高速化は、SEO対策としても効果的です。
  4. ユーザー体験の向上
    ページの応答速度が速くなることで、ユーザーの離脱率が低下し、サイトの利用率が向上します。

gzip圧縮が適用されるファイルの例

  • HTMLファイル
  • CSSファイル
  • JavaScriptファイル
  • XMLファイル
  • JSONファイル

一方、画像や動画などのバイナリファイルは、すでに圧縮されていることが多いため、gzipの対象外となる場合があります。これらのファイルに対しては、別の形式(WebPやAVIFなど)で圧縮することが推奨されます。

gzip圧縮は簡単に導入できる一方で、Webサイト全体のパフォーマンスに大きな影響を与える重要な技術です。次の項目では、Apacheにおけるgzip圧縮の設定方法について詳しく説明します。

Apacheでのgzipモジュールの有効化方法


Apacheでgzip圧縮を使用するには、「mod_deflate」モジュールを有効にする必要があります。mod_deflateは、Apacheに標準で含まれているモジュールで、簡単に設定・有効化できます。以下では、mod_deflateの有効化手順を説明します。

mod_deflateの確認と有効化

  1. モジュールが有効か確認
    Apacheがインストールされている環境で、以下のコマンドを実行してmod_deflateが有効か確認します。
apachectl -M | grep deflate

出力例:

 deflate_module (shared)


このように表示されれば、すでにmod_deflateは有効です。

  1. モジュールを有効にする
    もしmod_deflateが無効の場合は、以下のコマンドで有効化します。
a2enmod deflate


コマンドを実行後、Apacheを再起動して変更を反映します。

systemctl restart apache2

設定ファイルへのmod_deflateの追加


mod_deflateを有効化した後、Apacheの設定ファイル(/etc/apache2/apache2.conf またはサイトごとの設定ファイル)にgzip圧縮を適用する設定を追加します。
以下は基本的な設定例です。

<IfModule mod_deflate.c>
  # 圧縮対象のファイルタイプ
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
  AddOutputFilterByType DEFLATE text/css text/javascript application/javascript
  AddOutputFilterByType DEFLATE application/json application/xml application/xhtml+xml
  AddOutputFilterByType DEFLATE application/rss+xml application/atom+xml

  # 圧縮対象外のファイル
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|woff2|woff|zip|tar|gz|bz2|rar)$ no-gzip dont-vary
</IfModule>

Apacheの再起動


設定が完了したら、Apacheを再起動して変更を反映します。

systemctl restart apache2

有効化の確認


gzip圧縮が適用されているかを確認するには、ブラウザの開発者ツールで「ネットワーク」タブを開き、レスポンスヘッダーに「Content-Encoding: gzip」が含まれているかを確認します。

これでmod_deflateの有効化と基本的な設定は完了です。次は、静的ファイルへのgzip適用方法を詳しく解説します。

静的ファイルへのgzip適用設定


Apacheで静的ファイル(HTML、CSS、JavaScriptなど)にgzip圧縮を適用することで、Webページの読み込み速度が向上し、ユーザーエクスペリエンスが改善されます。ここでは、静的ファイルへのgzip圧縮を設定する方法を詳しく解説します。

Apache設定ファイルの編集


静的ファイルへのgzip圧縮は、Apacheの設定ファイルにmod_deflateの設定を追加することで行います。以下は、/etc/apache2/apache2.confまたはサイトごとの設定ファイルに記述する例です。

<IfModule mod_deflate.c>
  # HTML、CSS、JavaScriptファイルの圧縮
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
  AddOutputFilterByType DEFLATE text/css text/javascript application/javascript
  AddOutputFilterByType DEFLATE application/json application/xml application/xhtml+xml

  # 圧縮対象外のファイル(画像やアーカイブ)
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|ico|zip|tar|gz|bz2|rar|woff2|woff)$ no-gzip dont-vary

  # 圧縮レベルの設定(圧縮率と速度のバランスを取る)
  DeflateCompressionLevel 6

  # 古いブラウザでの不具合を回避
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

設定内容の解説

  • AddOutputFilterByType DEFLATE – 圧縮対象のMIMEタイプを指定します。HTML、CSS、JavaScript、JSONなどが対象です。
  • SetEnvIfNoCase – 画像や圧縮済みのファイル(zip、tarなど)はgzip圧縮の対象外としています。これにより、二重圧縮を防ぎます。
  • DeflateCompressionLevel – 圧縮レベルを設定します。0が無圧縮、9が最高圧縮率ですが、6程度が速度と圧縮率のバランスが良いとされています。
  • BrowserMatch – 特定の古いブラウザでgzip圧縮が原因の不具合を回避する設定です。Internet Explorerなどの互換性を考慮しています。

Apacheの再起動


設定が完了したら、Apacheを再起動して変更を反映します。

systemctl restart apache2

gzip圧縮の確認


ブラウザの開発者ツール(F12)を開き、「ネットワーク」タブで静的ファイルを選択し、レスポンスヘッダーにContent-Encoding: gzipが含まれているかを確認します。

また、コマンドラインでも確認可能です。

curl -I -H "Accept-Encoding: gzip" http://example.com/style.css


Content-Encoding: gzipが表示されれば、正しく圧縮が適用されています。

これで、Apacheによる静的ファイルへのgzip圧縮設定が完了しました。次は動的コンテンツへのgzip適用方法について説明します。

動的コンテンツへのgzip適用設定


Apacheでは、PHPやPerlなどの動的コンテンツにもgzip圧縮を適用できます。動的コンテンツはリクエストごとに生成されるため、圧縮することで応答速度が向上し、サーバー負荷の軽減が期待できます。ここでは、動的コンテンツにgzip圧縮を適用する設定方法を解説します。

PHPでのgzip圧縮


PHPでは、Apache側でgzipを適用する方法と、PHPコード内で直接gzip圧縮を行う方法があります。

1. Apacheのmod_deflateを利用した方法
静的ファイルと同様に、動的コンテンツにもmod_deflateを適用します。以下のように設定ファイルを編集します。

<IfModule mod_deflate.c>
  # 動的コンテンツの圧縮
  AddOutputFilterByType DEFLATE application/x-httpd-php application/json
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
</IfModule>

2. PHPコードで直接gzipを有効化する方法
PHPコード内でgzip圧縮を行う場合は、ob_start()関数を使用します。

<?php
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {
    ob_start("ob_gzhandler");
} else {
    ob_start();
}
?>


このコードを追加すると、クライアントがgzipをサポートしている場合に自動的に圧縮されます。

PerlやCGIスクリプトでのgzip圧縮


PerlやCGIスクリプトでもgzip圧縮を適用できます。以下はPerlスクリプトでgzipを適用する例です。

use IO::Compress::Gzip 'gzip';

my $output;
gzip \$content => \$output;
print "Content-Encoding: gzip\r\n";
print "Content-Length: " . length($output) . "\r\n";
print "Content-Type: text/html\r\n\r\n";
print $output;


このスクリプトは、動的に生成されたHTMLコンテンツをgzipで圧縮して出力します。

Apache設定の確認と再起動


設定が完了したら、Apacheを再起動して変更を反映します。

systemctl restart apache2

gzip圧縮の確認方法


動的コンテンツがgzip圧縮されているか確認するには、ブラウザの開発者ツールやコマンドラインを利用します。

curl -I -H "Accept-Encoding: gzip" http://example.com/dynamic.php


レスポンスヘッダーにContent-Encoding: gzipが含まれていれば、動的コンテンツのgzip圧縮が正しく適用されています。

これで動的コンテンツへのgzip適用が完了しました。次は、具体的なApache設定ファイルの例について解説します。

Apacheの設定ファイル例


Apacheで静的ファイルおよび動的コンテンツにgzip圧縮を適用する際の具体的な設定ファイル例を紹介します。この設定例を参考に、自身のサーバー環境に合わせてカスタマイズしてください。

Apacheのグローバル設定例(apache2.conf/httpd.conf)


以下は、Apacheのメイン設定ファイルに記述するgzip圧縮の基本的な例です。静的ファイルと動的コンテンツの両方に適用しています。

<IfModule mod_deflate.c>
  # 静的ファイルの圧縮
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
  AddOutputFilterByType DEFLATE text/css text/javascript application/javascript
  AddOutputFilterByType DEFLATE application/json application/xml application/xhtml+xml

  # 動的コンテンツの圧縮
  AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
  AddOutputFilterByType DEFLATE application/json application/rss+xml

  # 圧縮対象外のファイル(画像や圧縮済みファイル)
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|ico|zip|tar|gz|bz2|rar|woff2|woff|mp4|avi)$ no-gzip dont-vary

  # 圧縮レベルの設定(速度と圧縮率のバランス)
  DeflateCompressionLevel 6

  # 古いブラウザ対策
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

  # Varyヘッダーを付与してキャッシュの問題を回避
  Header append Vary Accept-Encoding
</IfModule>

バーチャルホストごとの設定例


サイトごとに異なる設定を行う場合は、各バーチャルホストファイル(例:/etc/apache2/sites-available/example.conf)に以下のように記述します。

<VirtualHost *:80>
  ServerName example.com
  DocumentRoot /var/www/example

  <IfModule mod_deflate.c>
    # サイト内の静的ファイル圧縮
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css text/javascript application/javascript
    AddOutputFilterByType DEFLATE application/json application/xml application/xhtml+xml

    # 圧縮しないファイル
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|zip|tar|gz|bz2|rar)$ no-gzip dont-vary
  </IfModule>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

.htaccessを利用した設定例


.htaccessファイルを使用してgzip圧縮を設定する場合は、サイトのルートディレクトリに以下を記述します。

<IfModule mod_deflate.c>
  # 圧縮対象のファイルタイプ
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
  AddOutputFilterByType DEFLATE text/css text/javascript application/javascript

  # 画像などの圧縮除外
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|gz|bz2|rar)$ no-gzip dont-vary

  # キャッシュの互換性
  Header append Vary Accept-Encoding
</IfModule>

設定後のApache再起動


設定ファイルを編集した後は、Apacheを再起動して設定を反映します。

systemctl restart apache2

設定のポイント

  • パフォーマンス向上 – HTMLやCSS、JavaScriptの圧縮を優先して設定します。
  • 除外ファイルの指定 – 画像や動画、アーカイブファイルは圧縮対象外とすることで、リソースの無駄遣いを防ぎます。
  • テスト環境で確認 – 本番環境に適用する前に、テスト環境で動作確認を行いましょう。

次は、gzip圧縮が正しく適用されているかを確認する方法について説明します。

gzip圧縮が適用されているかの確認方法


Apacheでgzip圧縮を設定した後は、正しく適用されているかを確認することが重要です。圧縮が適用されていない場合、設定ミスやブラウザ側の問題が考えられます。ここでは、ブラウザやコマンドラインを使ったgzip圧縮の確認方法を解説します。

ブラウザでの確認方法


ブラウザの開発者ツールを使用して、gzip圧縮が適用されているかを確認できます。

Google Chromeの場合

  1. サイトを開きます。
  2. F12キーを押して「開発者ツール」を開きます。
  3. 「ネットワーク」タブを選択します。
  4. リロードして、圧縮を確認したいファイルをクリックします。
  5. 「ヘッダー」セクションで「Content-Encoding: gzip」が表示されていれば、圧縮が適用されています。

Firefoxの場合

  1. サイトを開きます。
  2. Ctrl + Shift + Iで開発者ツールを起動します。
  3. 「ネットワーク」タブを選択します。
  4. 圧縮確認対象のファイルをクリックし、「レスポンスヘッダー」で「Content-Encoding: gzip」を確認します。

コマンドラインでの確認方法


コマンドラインからcurlを使ってgzip圧縮の適用状況を確認できます。

curl -I -H "Accept-Encoding: gzip" http://example.com


出力例:

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8


「Content-Encoding: gzip」が表示されていれば、圧縮が適用されています。

オンラインツールでの確認


オンラインのgzip圧縮チェッカーを使って、URLを入力するだけで圧縮の有無を確認できます。

Apacheログでの確認


Apacheのアクセスログにgzip圧縮の情報が記録される場合があります。combined形式でログを設定している場合は、以下のように確認できます。

cat /var/log/apache2/access.log | grep gzip

よくある問題と解決方法

  • Content-Encodingが表示されない場合
  • mod_deflateが有効になっていない可能性があります。a2enmod deflateで有効化し、Apacheを再起動してください。
  • 設定ファイルに圧縮対象のMIMEタイプが正しく記述されているか確認します。
  • 特定のファイルが圧縮されない場合
  • 画像や動画など、圧縮対象外のファイルが設定されている可能性があります。設定ファイルの「SetEnvIfNoCase」で除外対象を確認してください。

これでgzip圧縮の確認方法は完了です。次は、gzip圧縮の例外設定方法について解説します。

gzip圧縮の例外設定方法


すべてのファイルをgzip圧縮するわけではなく、特定のファイルやディレクトリを除外することが必要な場合があります。画像や動画、圧縮済みのファイルなどは、gzip圧縮を適用しても効果が薄く、二重圧縮によるパフォーマンス低下やファイル破損の原因になる可能性があります。ここでは、Apacheでgzip圧縮の例外を設定する方法を解説します。

特定のファイルタイプを除外する方法


Apacheの設定ファイルで、圧縮を適用しないファイルタイプを「SetEnvIfNoCase」を使って指定できます。

設定例:

<IfModule mod_deflate.c>
  # 圧縮対象のファイルタイプ
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
  AddOutputFilterByType DEFLATE text/css text/javascript application/javascript
  AddOutputFilterByType DEFLATE application/json application/xml application/xhtml+xml

  # 圧縮対象外のファイルタイプ
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|ico|zip|tar|gz|bz2|rar|woff2|woff|mp4|avi)$ no-gzip dont-vary

  # キャッシュの互換性
  Header append Vary Accept-Encoding
</IfModule>


ポイント解説:

  • 画像ファイル (gif|jpe?g|png|webp|avif|ico)
  • 圧縮済みアーカイブ (zip|tar|gz|bz2|rar)
  • フォントファイル (woff2|woff)
  • 動画ファイル (mp4|avi)

これらのファイルは既に圧縮されているため、gzip圧縮の対象から除外しています。

特定のディレクトリを除外する方法


ディレクトリ単位でgzip圧縮を除外したい場合は、Locationディレクティブを使用します。

設定例:

<Location /images>
  SetEnv no-gzip
</Location>

<Location /backup>
  SetEnv no-gzip
</Location>


これにより、/imagesディレクトリや/backupディレクトリ内のファイルはgzip圧縮の対象外になります。

.htaccessでの例外設定


.htaccessファイルを使用して、特定のファイルやディレクトリのgzip圧縮を除外することも可能です。

例:

<IfModule mod_deflate.c>
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|gz|bz2|rar|woff2|woff|mp4|avi)$ no-gzip
  SetEnvIfNoCase Request_URI ^/backup/ no-gzip
</IfModule>

特定のブラウザを対象外にする方法


一部の古いブラウザではgzip圧縮によってページが正しく表示されないことがあります。以下の設定で古いブラウザをgzipの対象外にできます。

<IfModule mod_deflate.c>
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

Apache再起動


設定後、Apacheを再起動して変更を反映します。

systemctl restart apache2

設定の確認


以下のコマンドで、特定のファイルやディレクトリにgzip圧縮が適用されていないか確認できます。

curl -I -H "Accept-Encoding: gzip" http://example.com/images/logo.png


Content-Encodingが表示されなければ、圧縮が除外されています。

これでgzip圧縮の例外設定が完了しました。次は、トラブルシューティングと注意点について解説します。

トラブルシューティングと注意点


gzip圧縮をApacheで設定しても、期待通りに動作しないことがあります。圧縮が適用されない、特定のファイルだけが圧縮されない、またはページの表示が崩れるなどの問題が発生する可能性があります。ここでは、gzip圧縮がうまく機能しない場合のトラブルシューティング方法と、設定時の注意点について解説します。

よくある問題と解決方法

1. gzipが適用されない


原因1: mod_deflateが有効になっていない
解決方法:

a2enmod deflate
systemctl restart apache2


mod_deflateを有効にして、Apacheを再起動します。

原因2: 設定ファイルの記述ミス
解決方法: 設定ファイルを確認し、記述ミスがないかを確認します。特に「AddOutputFilterByType DEFLATE」が正しく記述されているかを確認してください。

例:

AddOutputFilterByType DEFLATE text/html text/plain text/xml

原因3: 設定ファイルが反映されていない
解決方法: Apache設定をリロードして反映させます。

systemctl reload apache2

2. 特定のファイルだけが圧縮されない


原因1: 除外設定が影響している
解決方法: 設定ファイルで「SetEnvIfNoCase」で指定した除外条件が原因である可能性があります。

例:

SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|zip|tar|gz|bz2|rar)$ no-gzip dont-vary


この設定を一時的にコメントアウトして動作確認を行います。

原因2: MIMEタイプの記述漏れ
解決方法: 圧縮対象のMIMEタイプが設定に含まれていない可能性があります。必要なファイルタイプを追加します。

AddOutputFilterByType DEFLATE application/javascript application/json

3. 圧縮が原因でページが正しく表示されない


原因1: 古いブラウザとの互換性問題
解決方法: 特定のブラウザでgzip圧縮を無効にします。

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

原因2: 不正な圧縮によるエラー
解決方法: DeflateCompressionLevelを下げて、圧縮率を調整します。

DeflateCompressionLevel 5

gzip圧縮が適用されているかの確認


Apacheでgzip圧縮が有効になっているかを確認するには、以下のコマンドを使用します。

curl -I -H "Accept-Encoding: gzip" http://example.com


レスポンスに「Content-Encoding: gzip」が含まれているかを確認します。

例:

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html

Apacheのエラーログを確認する


gzip圧縮がうまく機能しない場合、Apacheのエラーログにヒントが記録されていることがあります。

cat /var/log/apache2/error.log


設定ファイルのエラーやモジュールの問題を確認できます。

設定変更後の再起動を忘れずに


設定変更後は、必ずApacheを再起動またはリロードして反映させます。

systemctl restart apache2

これでトラブルシューティングと注意点の解説は完了です。次は、記事のまとめを記述します。

まとめ


本記事では、Apacheでgzip圧縮を適用する方法について解説しました。静的ファイルと動的コンテンツの両方にgzip圧縮を導入することで、Webサイトのパフォーマンスが大幅に向上し、ユーザー体験の改善や帯域幅の節約が期待できます。

mod_deflateモジュールを有効化し、適切な設定を行うことで、簡単に圧縮を実装できます。また、特定のファイルやディレクトリを除外する方法や、トラブルシューティングについても説明しました。

gzip圧縮は比較的シンプルな技術ですが、その効果は非常に高く、サイトの表示速度がSEOにも好影響を与えます。設定後はブラウザやコマンドラインを使って圧縮の適用状況を確認し、必要に応じて設定を調整しましょう。

適切なgzip圧縮の導入で、ユーザーにとって快適なWeb体験を提供することができます。

コメント

コメントする

目次