綺麗に死ぬITエンジニア

Apache HTTP Server パフォーマンスチューニングまとめ

2015-10-07

備忘録としてApacheのパフォーマンスチューニングを簡潔に羅列していきます。ちゃんとチューニングができているかの確認用(チェックリスト)なので、設定方法や動作等詳しく知りたい人は、改めてググってください。

Apacheのセキュリティ対策については、こちらにまとめてありますので、よろしければどうぞ。

Keep Aliveの設定

KeepAlive

「ON」にすることで、Keep Aliveが有効になり、同一クライアントに対してTCPコネクションを使いまわすことができるようになります。

デフォルトでONなので、通常は特に設定する必要はないです。

httpd.conf等に下記を記述します。

KeepAlive On

MaxKeepAliveRequests

1つのKeep Aliveで受け付けるリクエストの数を指定します。目安として、「Webページ1つ当たりの平均的なコンテンツ数+α」に設定します。デフォルト値は「100」です。

httpd.conf等に下記を記述します。

MaxKeepAliveRequests 100

KeepAliveTimeout(デフォルト: 15)

コネクションを確立しているクライアントからのリクエストが「KeepAliveTimeout」で指定した秒だけないと、コネクションを切断します。サーバーのリソースが消費されることを避ける場合には、2秒といった短い値を設定することもあります。

httpd.conf等に下記を記述します。

KeepAliveTimeout 15

不要なモジュールの削除

「LoadModule」ディレクティブで使用していないモジュールをコメントアウトすることで、余計なリソースの消費を抑えることができます。

シンボリックリンク先の参照を許可する

シンボリック先を参照するのは安全性に問題があるので利用しない方が良いですが、ファイルやディレクトリーがシンボリックされているかどうかチェックするためにそれぞれのファイルやディレクトリーに対してチェックする処理を動作させることになるため、許可した方がパフォーマンスは向上します。

httpd.conf等に下記を記述します。

Options FollowSymLinks

.htaccessを無効にする

.htaccessが有効の場合、ディレクトリーにアクセスするたびに.htaccessが存在するかを確認する処理が走ることになるため、パフォーマンスが低下する懸念があります。

httpd.conf等に下記を記述します。

AllowOverride None

Timeoutの設定

「TimeOut」ディレクティブで「GETリクエストを受け取るのにかかる待ち時間」「POSTやPUTリクエストにおいて、次のTCPパケットが届くまでの待ち時間」「レスポンスを返す際、TCPのACKが返ってくるまでの待ち時間」(秒)を設定します。短くすると、多くのリクエストを処理できるようになりますが、短くし過ぎるとクライアントとの接続が頻繁に中断してしまうようになってしまいます。

httpd.conf等に下記を記述します。

Timeout 10

DNS問い合わせを無効にする

「HostnameLookups」ディレクティブは、デフォルトで「Off」になっているので、通常は変更しなくて大丈夫です。ホスト認証などは出来る限りIPアドレス指定にします。

httpd.conf等に下記を記述します。

HostnameLookups Off

prefork MPMのチューニング

prefork MPMのパラメータをサーバリソースに合わせ、適切に設定します。

<ifmodule prefork.c="">
StartServers X
MinSpareServers X
MaxSpareServers XX
ServerLimit XXX
MaxClients XXX
MaxRequestsPerChild XXXXX
</ifmodule>

StartServers(デフォルト: 5)

Apache起動時の最初の子プロセス数を指定します。起動直後に高負荷をかけたい場合に上げます。

MinSpareServers(デフォルト: 5) & MaxSpareServers(デフォルト: 10)

子プロセス数をMinSpareServers~MaxSpareServersの間で自動的に調整します。待機プロセスの消費が激しく、新たな子プロセスの起動が間に合わない場合には、徐々に値を引き上げていきましょう。高すぎると、無駄にサーバーリソースを消費してしまいます。

ServerLimit(デフォルト: 256) & MaxClients(デフォルト: 256)

起動可能な子プロセスの上限を指定します。MaxClientを増加させるにはServerLimitも増加させなければなりません。

目安として、「MaxClients=使用可能なメモリ量/Apacheの1プロセスが使用するメモリ量」とすると良いです。

起動できるプロセス数にはOSの限界もあるため、ulimitコマンドで確認・変更も忘れずに行いましょう。

MaxRequestsPerChild(デフォルト: 10000)

メモリリークを引き起こすようなプログラムを動的コンテンツ内で使用している場合、プログラムを見直すことが第一ですが、Apache側でも使い回しているプロセスを定期的に再起動させることで、とりあえずはメモリリークを防ぐことができるようになります。再起動タイミングは、不具合の程度にもよりますが、なるべく「5000」や「6000」といった大きな値を設定するようにしましょう。

まとめ

改めて言いますが、確認用で概要しか記述していないので、それぞれの項目については改めて学習してください。一つ一つの項目が、何気にきちんと突き詰めると、結構な学習量になるかと思います。

また、プロジェクトによっては設定できない(してはいけない)項目もあるかと思いますので、しっかりとした検証を行い、動作確認をとってから使用するようにしてください。

それではみなさん、安全・快適なApacheライフを!

続けて、Apacheのセキュリティ対策について知りたい方は、こちらからどうぞ!