2026年9月17日

2026年9月17日

Apacheの帯域制限設定(mod_ratelimit)でダウンロード速度を抑える方法

Apache で転送速度を抑えたいときは、標準モジュールの mod_ratelimit を有効にし、対象の場所に SetOutputFilter RATE_LIMIT と SetEnv rate-limit 値 を書きます。値の単位は KiB/秒で、制限は「1つの接続(リクエスト)ごと」にかかります。この記事では設定手順、WordPress のアップロードファイルへの適用例、効果の測り方、そして mod_ratelimit ではできないことを整理します。

mod_ratelimitでできること・できないこと

mod_ratelimit は、Apache がクライアントへ送る応答の速度に上限を設ける出力フィルターです。Apache 2.4 から標準で同梱されています。

できること:

  • 大きなファイル(動画、ZIP、バックアップファイルなど)のダウンロード速度を1接続あたり一定以下に抑える
  • 最初の一定量だけは速く送り、その後に速度を絞る(rate-initial-burst)
  • 特定のディレクトリや拡張子だけに制限をかける

できないこと:

  • IP アドレスごと・ユーザーごとの合計帯域の制限。制限は接続単位なので、同時に複数の接続を開くクライアントにはその本数分の帯域が出ます
  • リクエスト回数の制限(1秒あたり何回まで、など)
  • 月間転送量の管理や、上限に達したら止める仕組み

アクセスの集中や不正なクロールへの対策としては、リクエスト数を見て遮断する mod_evasive や WAF(mod_security など)、fail2ban のほうが目的に合います。mod_ratelimit は「正規の利用者による大きな転送が、ほかの利用者の表示速度や回線を圧迫しないようにする」ための道具だと考えると選びやすくなります。

手順1:モジュールを有効にする

Debian / Ubuntu 系では a2enmod で有効にします。

sudo a2enmod ratelimit
sudo apachectl configtest
sudo systemctl reload apache2

RHEL / AlmaLinux / Rocky Linux 系では、/etc/httpd/conf.modules.d/ 配下の設定ファイルで ratelimit_module の LoadModule 行が有効になっているかを確認します。どのファイルに書かれているかはパッケージのバージョンで異なるため、grep で探すと見つけやすくなります。

grep -rn ratelimit /etc/httpd/conf.modules.d/
httpd -M | grep ratelimit

httpd -M(Debian 系は apache2ctl -M)の出力に ratelimit_module が出れば読み込まれています。

手順2:制限をかける場所と速度を決める

公式ドキュメントの例に近い形で、/downloads 以下に制限をかける設定です。バーチャルホストの設定ファイルに書きます。

<Location "/downloads">
    SetOutputFilter RATE_LIMIT
    # 1接続あたり 400 KiB/秒に制限
    SetEnv rate-limit 400
    # 最初の 512 KiB は制限せずに送る
    SetEnv rate-initial-burst 512
</Location>

rate-limit は KiB/秒です。目安として、1024 なら約 1 MiB/秒(約 8 Mbps)、400 なら約 3.2 Mbps になります。rate-initial-burst は Apache 2.4.24 以降で使える設定で、小さなファイルや画像はほぼ待たずに届き、大きなファイルだけが絞られるという振る舞いにできます。

速度を決めるときは「サーバーの回線を何本の同時ダウンロードで分け合うか」から逆算するのが現実的です。たとえば回線に余裕を持たせて 50 Mbps 程度を大容量ファイルの配信に充てたいなら、同時に5本程度のダウンロードを想定して1本あたり 10 Mbps(約 1250 KiB/秒)前後、といった考え方です。あくまで出発点なので、次の手順で実測して調整します。

WordPressのファイルに適用する例

WordPress のメディアライブラリに置いたファイルは、PHP を通らずに Apache が直接配信します。そのため uploads 配下に対してディレクトリや拡張子で条件を付けると、そのまま制限がかかります。

<Directory "/var/www/example/wp-content/uploads">
    <FilesMatch "\.(zip|mp4|mov|pdf)$">
        SetOutputFilter RATE_LIMIT
        SetEnv rate-limit 1024
        SetEnv rate-initial-burst 1024
    </FilesMatch>
</Directory>

画像(jpg・png・webp など)を対象に含めると、記事ページの表示が遅くなり、読者の体験や表示速度の指標に影響します。制限は大容量のファイル形式に絞るのが基本です。

サーバー設定を編集できない環境では、.htaccess にも書けます。SetOutputFilter と SetEnv は .htaccess で使う場合に AllowOverride FileInfo が必要です。<Location> は .htaccess では使えないため、<FilesMatch> を使います。

# wp-content/uploads/.htaccess
<IfModule mod_ratelimit.c>
    <FilesMatch "\.(zip|mp4)$">
        SetOutputFilter RATE_LIMIT
        SetEnv rate-limit 1024
    </FilesMatch>
</IfModule>

ダウンロード管理系のプラグインが PHP からファイルを送っている場合は、実際のURLがプラグインの処理用URLになっていることがあります。どのURLで配信されているかをブラウザの開発者ツールで確かめてから、制限の対象を決めてください。

手順3:効果を測る

設定が効いているかは curl の転送速度表示で確認できます。speed_download はバイト/秒で表示されるため、1024 で割ると KiB/秒になります。

curl -s -o /dev/null -w 'size=%{size_download} speed=%{speed_download} B/s time=%{time_total}s\n' \
  https://example.com/wp-content/uploads/sample.zip

rate-limit 1024 なら、burst 分を除いたおおよその速度が 1,048,576 B/秒前後になるはずです。比較のため、制限対象外のファイルでも同じコマンドを実行しておくと違いがはっきりします。測定はサーバーと同じデータセンター内ではなく、実際の利用者に近いネットワークから行うのが望ましいです。

運用でつまずきやすい点

速度を絞るとダウンロード1件あたりの所要時間が伸び、その間 Apache は接続を保持し続けます。prefork MPM などワーカー数に余裕が無い構成では、遅いダウンロードがワーカーを占有し、通常ページの応答待ちが増えることがあります。制限を入れたら、mod_status などで同時接続数と待ち状態のワーカー数を観察し、MaxRequestWorkers に余裕があるか確認してください。

CDN を前段に置いている場合、mod_ratelimit が制限するのは CDN からオリジンへの取得速度です。利用者への配信速度は CDN 側の挙動で決まるため、期待した効果が出ないことがあります。CDN 経由の配信では、CDN 側の機能を確認するほうが早い場合もあります。

圧縮(mod_deflate)や HTTP/2 と組み合わせたときの振る舞いは、Apache のバージョンや設定順で変わる可能性があります。本番に入れる前にステージング環境で上記の curl 測定を行い、HTTP/1.1 と HTTP/2 の両方で速度を確かめると安心です。設定を変える前には元の設定ファイルをバックアップし、apachectl configtest を通してから再読み込みしてください。

mod_ratelimit の仕様は Apache 2.4 系の公式ドキュメントに基づいています(2026年10月現在)。マイナーバージョンでの変更点は、利用中のバージョンのドキュメントで確認してください。

まとめ

  • mod_ratelimit は SetOutputFilter RATE_LIMIT と SetEnv rate-limit(KiB/秒)で応答速度に上限を設ける
  • 制限は接続ごと。IP 単位の合計帯域やリクエスト回数の制限には使えない
  • rate-initial-burst(2.4.24 以降)で最初の一定量だけ速く送れる
  • WordPress では uploads 配下の大容量ファイル形式に絞って適用し、画像は対象外にする
  • curl の speed_download で効果を測り、ワーカー数と CDN の影響を確認する
  • 変更前にバックアップを取り、ステージングで試してから本番に反映する

お気軽にご相談ください

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