2010.01.21
社員R 開発

Apache負荷軽減のこと

ああ、またも書くことがありません。ので、あんまり書きたくなかった技術関係の話を書こうと思います。

Apacheには多数のモジュールが存在しますが、その中で負荷軽減に利用できるものを紹介したいと思います。つまんないですね。

以下はApache 2系について書いています。

■mod_deflate

https://httpd.apache.org/docs/2.2/ja/mod/mod_deflate.html

apacheに標準で付属

コンテンツを送信する際にgzip圧縮して送信するモジュールでネットワークの軽減効果があります。サーバーのCPUパワーに余裕がありネットワークの帯域に余裕が無い場合に有効なモジュールです。

ただし、注意しなければならないのは、jpgなどの最初から圧縮されているファイルに対しては効果がないということです。これらの圧縮済みファイルがサイトコンテンツの大半を占めるような場合あまり効果が望めないことでしょう。

2001年に2chが転送量超過で閉鎖の危機におちいったとき、転送量軽減対策に最も寄与したのがこのコンテンツのgzip圧縮でした。あそこはコンテンツが100%プレーンテキストなので効果はてきめんだったようです。

■mod_expires

https://httpd.apache.org/docs/2.2/ja/mod/mod_expires.html

apacheに標準で付属

これはコンテンツの拡張子単位で、ブラウザキャッシュの有効期限を指定できるモジュールです。

たとえば、未来永劫絶対に更新されることのない画像ファイルがあるとします。そういったファイルに対して例えば二ヶ月のキャッシュ保持期間を指定してやれば、ブラウザは二ヶ月の間ローカルのキャッシュを参照します。

このモジュールの局所的な弱点として、拡張子のないファイルの保持期限は指定できないということです。たとえばpukiwikiのファイルは拡張子がないため指定ができません。

■mod_cband

https://cband.linux.pl/

CentOSはパッケージなし

debianのパッケージ名 libapache2-mod-cband

ネットワークの帯域制御、同時接続数の制御などがおこなえるモジュールです。この手のモジュールでは、bw_mod mod_bwshareなどがありますが、現在最も多機能で高機能なのはこのモジュールだと思います。一時期公式サイトが閉鎖してプロジェクトの存続が心配されましたが、現在は無事復帰しています。

設定例

#サーバー全体の転送上限を設ける

#サーバーの転送上限を2048kbps、一秒間に最大40リクエスト、同時接続数を20に制限

CBandSpeed 2048 40 20

#1IPアドレスあたりの転送上限を設ける

#1IPアドレスへの転送上限を1024kbps、一秒間に最大20リクエスト、同時接続数を10に制限

CBandRemoteSpeed 1024 20 10

#4週間の転送量上限を100Mbpsに設定 超過した場合503ページを表示

CBandLimit 100M

CBandScoreBoard /var/apache/scoreboard

CBandPeriod 4W

#4週間の転送量上限が100Mbpsを超過した場合、サーバー全体の転送上限を64kbps、一秒間に最大10リクエスト、同時接続数を5に制限

CBandLimit 100M

CBandScoreBoard /var/apache/scoreboard

CBandExceededSpeed 64 10 5

CBandPeriod 4W

#4週間の転送量上限が100Mbpsを超過した場合、CBandExeededURLで設定した転送URLを表示

CBandLimit 100M

CBandScoreBoard /var/apache/scoreboard

CBandExeededURL https://www.example.jp/traffic_exceeded.html

CBandPeriod 4W

■mod_evasive

https://www.zdziarski.com/projects/mod_evasive/

CentOSはパッケージなし

debianのパッケージ名 libapache2-mod-evasive

DoSおよびDDoS攻撃をブロックするモジュールです。

サイト全体もしくはページあたりしきい値以上のアクセス数を記録したIPアドレスを一定時間ブロックします。

私が自宅に立てているサーバーで導入したところ、体感はできないものの統計を見たら効果は絶大でした。

下記は導入前のホストごとのアクセス上位10の画面です。ホスト名は省略しています。

oga_evasive01

一番多いホストからは34万件ものページヒットがあります。ちなみに10位の23603ページヒットは、74.125.74.129のグーグルクローラーのアドレスです。かなり頻繁にアクセスのあるグーグルクローラー以上のページヒットが9件も存在しているのが導入前です。

以下は導入後の画面です。

oga_evasive02

こちらの1位は74.125.74.129のグーグルクローラーです。10位圏内のページヒットの最大値が、ほぼ1/10になったことがわかります。

設定例

#ハッシュテーブルサイズ おまじない

DOSHashTableSize 3097

#ひとつのページに対して1秒間に2回アクセスがあった場合ブロック

DOSPageCount 2

DOSPageInterval 1

#サイト全体で1秒間に50回アクセスがあった場合ブロック

DOSSiteCount 50

DOSSiteInterval 1

#10秒間ブロックする

DOSBlockingPeriod 10

#メール送信先

DOSEmailNotify hoge@example.com

#ホワイトリスト

DOSWhitelist 133.242.17.62

#ログの出力先

DOSLogDir “/var/log/httpd”

(社員R)

一覧に戻る