まずは、最新版のApacheをインストールしましょう
mod_cacheは、標準でインストールされています。ただ、先の問題 があって、最新版のApacheをインストールしたいわけです。
そのため、ここでは、最新版のApacheを使って mod_cache を使ってみます。
最新版のApacheをインストールについては、
→ httpd(apache)の最新版をインストールする(CentOS,ScientificLinux編) を参照してください。
mod_cache(mod_disk_cache) の設定を行います
まずは、/etc/httpd/conf/httpd.confで mod_cache, mod_disk_cache を有効にします。
...
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
...
|
mod_disk_cache を使用する場合は、必ず、mod_cacheも同時にロードしておきます。
mod_mem_cache を使用する場合も同様、必ず、mod_cacheも同時にロードしておきます。
もし、ロードしていない場合は、Apacheの起動時にエラーが出力されます。
$ /etc/init.d/httpd start
httpd を起動中: httpd: Syntax error on line 200 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_disk_cache.so into server: /etc/httpd/modules/mod_disk_cache.so: undefined symbol: ap_cache_cacheable_hdrs_out
[失敗]
|
続けて仮想ウェブサーバー ( www.example.com ) でキャッシュを使うように設定してみます。
( 別ファイルにすることもできますが、)ここでは、/etc/httpd/conf/httpd.conf の末尾に、仮想ウェブサーバー ( www.example.com ) の設定を行ってみます。
<VirtualHost *:80>
# serverの管理者メールアドレスを設定します。
#ServerAdmin webmaster@localhost
ServerAdmin www@example.com
# serverのサーバー名を設定します。
ServerName www.example.com
# 最初の確認作業の間は、debugを指定しておきましょう。
# 正しくキャッシュされるかどうか、エラーログで確認できます。
LogLevel debug
# エラーログの出力先
ErrorLog /var/log/httpd/example_error.log
# アクセスログの出力先
CustomLog /var/log/httpd/example_access.log combined
# CentOSなどのデフォルトのホームディレクトリに合わせておきます。
DocumentRoot /var/www/html
<Directory "/var/www/html">
# "/var/www/html"ディレクトリ配下では、CGIが実行できるようにします。
Options Includes
Order allow,deny
allow from all
DirectoryIndex index.html index.php
</Directory>
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot /tmp/cache
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreCacheControl On
CacheIgnoreURLSessionIdentifiers PHPSESSID jsessionid
CacheIgnoreHeaders Set-Cookie
CacheMaxFileSize 2000000
</IfModule>
</VirtualHost>
|
ここでは、
mod_cache について設定していません。
<IfModule mod_cache.c>
...
</IfModule>
|
これは、
mod_disk_cache が
mod_cache の上位モジュール(包含したモジュール)であるためで、
mod_cacheで定義されているディレクティブ情報は、
mod_disk_cache でも設定することができるからです。
mod_cacheの設定を行う可能性があるのは、
mod_disk_cache と
mod_mem_cache の両方を利用する場合で、共通的なディレクティブ設定を行いたい時でしょう。
以下は、apacheでの例です。
<IfModule mod_cache.c>
<IfModule mod_disk_cache.c>
CacheRoot /tmp/cache
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
</IfModule>
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>
CacheDisable http://security.update.server/update-list/
</IfModule>
|
この例のように
mod_disk_cache でも
mod_mem_cache でも キャッシュ無効としたいURLを共通的に定義することができます。
CacheEnable disk /
[フォーマット]
CacheEnable cache_type url-string
[概要]
このディレクティブは、mod_cache モジュールが url-string
以下の URL をキャッシュするようにします。
cache_type
には、disk
(ディスクへのキャッシュ指示) 以外にmem
(メモリへのキャッシュ指示),fd
を指定することができます。(詳細以下参照)
- mem メモリーベースのストレージマネージャです。
mod_mem_cache
で実装されているメモリを使ったストレージ 管理方式を使うように mod_cache
に指示します。
- disk ディスクベースのストレージマネージャです。
mod_disk_cache
で実装されているディスクを使ったストレージ 管理を使うように mod_cache
に指示します。
- fd ファイルディスクリプタキャッシュ
mod_mem_cache
により実装されているファイル記述子の キャッシュを使うように mod_cache
に指示します。
CacheRoot /tmp/cache
[フォーマット]
CacheRoot directory
[概要]
このディレクティブは、キャッシュファイルを 保管するためのディスク上のディレクトリを指定します。
mod_disk_cache
モジュールが Apache サーバにロードされて いるか、組み込まれていれば、このディレクティブは必ず 定義しなければなりません。
CacheDirLevels 2
[フォーマット]
CacheDirLevels levels
[概要]
このディレクティブは、キャッシュの サブディレクトリの深さを設定します。CacheDirLevels × CacheDirLength < 20 となるように指定します。
CacheDirLength 1
[フォーマット]
CacheDirLength length
[概要]
このディレクティブは、キャッシュ 階層の各サブディレクトリの文字数を設定します。CacheDirLevels × CacheDirLength < 20 となるように指定します。
CacheRoot
,CacheDirLevels
,CacheDirLength
の3つのディレクティブによって、
キャッシュディレクトリが決定します。
以下の例の場合で簡単に解説します。
CacheRoot /tmp/cache
CacheDirLevels 2
CacheDirLength 1
|
- Apacheは、キャッシュしようとするURL、プロトコルなどの情報を ハッシュ計算した22文字(以降、ハッシュ文字と称す)の情報へ変換します。
- ハッシュ文字の長さ1文字(CacheDirLength) × 2(CacheDirLevels) を取り出し、ディレクトリ名とします。残りをファイル名とします。
例えば、
ハッシュ文字が、ABCDEFGHIJKLMNOPQRST
とあった場合
キャッシュディレクトリは、
/tmp/cache/A/B
キャッシュファイル名は、
CDEFGHIJKLMNOPQRST.header
のようなイメージになります。
CacheIgnoreCacheControl On
[フォーマット]
CacheIgnoreCacheControl On|Off
[概要]
このディレクティブは、キャッシュされているコンテンツを返さないようにクライアントから リクエストされても無視するよう指示します。
通常、クライアントから、以下のようなヘッダ情報があった場合、キャッシュされているコンテンツを返さないというルールがありますが、それを無視する(On指定時)ことができるものです。
Cache-Control: no-cache
Pragma: no-store
CacheIgnoreURLSessionIdentifiers jsessionid PHPSESSID
[フォーマット]
CacheIgnoreURLSessionIdentifiers identifier [identifier] ...
[概要]
このディレクティブは、アプリケーションがセッションIDをURLLへ含ませている場合、その情報を無視するよう指示します。
例えば、以下は、java , php によるセッションIDをURLに含ませている例です。
/someapplication/image.gif;jsessionid=123456789
/someapplication/image.gif?PHPSESSIONID=12345678
これらのセッションIDがURLに含まれたまま、キャッシュされると同じURLでもセッションごとに別コンテンツと認識されキャッシュされてしまうので、
このディレクティブで無視する識別子名を指定できます。
CacheIgnoreHeaders Set-Cookie
[フォーマット]
CacheIgnoreHeaders header-string [header-string] ...
[概要]
このディレクティブは、キャッシュに保管しない追加の HTTP ヘッダを指定します。
そもそも以下の情報は、CacheIgnoreHeaders
の設定に関係なく、キャッシュされません。その情報に加えて、キャッシュしたくないヘッダー情報を指定することができます。
Connection
Keep-Alive
Proxy-Authenticate
Proxy-Authorization
TE
Trailers
Transfer-Encoding
Upgrade
CacheMaxFileSize 2000000
[フォーマット]
CacheMaxFileSize bytes
[概要]
このディレクティブは、ドキュメントを キャッシュするかどうかを判定する、最大のサイズをバイト数で設定します。上記の設定例だと 2MB となります。
CacheDisable http://security.update.server/update-list/
[フォーマット]
CacheDisable url-string
[概要]
このディレクティブは、mod_cache モジュールが url-string
以下の URL をキャッシュしないようにします。
MCacheSize 4096
[フォーマット]
MCacheSize KBytes
[概要]
このディレクティブは、キャッシュに 使われるメモリの大きさをキロバイト (1024 バイト単位) で設定します。(デフォルト:100)
このサイズを超えたキャッシュ要求がきた場合、そのキャッシュ要求分の現在のキャッシュを破棄し、新しいキャッシュ要求分をキャッシュします。
MCacheMaxObjectCount 100
[フォーマット]
MCacheMaxObjectCount value
[概要]
このディレクティブは、 キャッシュされるオブジェクトの最大数を指定します。(デフォルト:1009)
MCacheMinObjectSize 1
[フォーマット]
MCacheMinObjectSize bytes
[概要]
このディレクティブは、ドキュメントを キャッシュするかどうかを判定する、最小のサイズをバイト数で設定します。(デフォルト:0)
MCacheMaxObjectSize 2048
[フォーマット]
MCacheMaxObjectSize bytes
[概要]
このディレクティブは、ドキュメントを キャッシュするかどうかを判定する、最大のサイズをバイト数で設定します。(デフォルト:10000)
上記の設定を終えたら、Apacheの再起動を行っておきます。
$ /etc/init.d/httpd restart
...
|
mod_cache でキャッシュする
では、ちゃんとキャッシュできるか確認してみましょう。
他のPC、あるいはサーバーから wgetでアクセスしてみます。
クライアント
$ wget http://www.example.com/
--2013-04-10 10:28:05-- http://www.example.com/
www.example.com (www.example.com) をDNSに問いあわせています... 192.168.1.99
www.example.com (www.example.com)|192.168.1.99|:80 に接続しています... 接続し ました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 7736 (7.6K) [text/html]
`index.html.14' に保存中
100%[======================================>] 7,736 --.-K/s 時間 0s
Last-modified ヘッダが無効です -- 日付を無視します。
2013-04-10 10:28:11 (132 MB/s) - `index.html.14' へ保存完了 [7736/7736]
|
この時のApacheのエラーログを確認してみます。
Apacheサーバーのエラーログ
[Tue Apr 02 07:42:12 2013] [debug] mod_cache.c(141): Adding CACHE_SAVE filter for /
[Tue Apr 02 07:42:12 2013] [debug] mod_cache.c(148): Adding CACHE_REMOVE_URL filter for /
[Tue Apr 02 07:42:17 2013] [debug] mod_cache.c(755): cache: Caching url: /
[Tue Apr 02 07:42:17 2013] [debug] mod_cache.c(761): cache: Removing CACHE_REMOVE_URL filter.
[Tue Apr 02 07:42:17 2013] [debug] mod_disk_cache.c(985): disk_cache: Stored headers for URL http://www.example.com:80/?
[Tue Apr 02 07:42:17 2013] [debug] mod_disk_cache.c(1087): disk_cache: Body for URL http://www.example.com:80/? cached.
|
上記のように cached が出力されていれば、キャッシュできていると思います。
また、lsコマンドでキャッシュファイルが作成されている様子も確認できます。
$ ls -R /tmp/cache/
/tmp/cache/:
y
/tmp/cache/y:
A
/tmp/cache/y/A:
QpOFFjBlkQYZyMvA9EmQ.data QpOFFjBlkQYZyMvA9EmQ.header
|
このようにキャッシュされれば、次回からのクライアントからのアクセス時の応答速度は、間違いなく体感できるぐらい早くなります。
キャッシュを使うと、PHPなどの動的なページの表示速度は格段に違います。
キャッシュの威力は、いろんなサイトでデータ化されていますから、参考にされると良いと思います。
また性能は、各サーバーのディスクパフォーマンス、CPUパフォーマンスなどにも影響されますので、
同じパフォーマンスが出るとは限りませんが、それでも、間違いなくWordpressなどのPHPによるCMSなどは、
キャッシュの有無で表示速度は、改善されるでしょう。
最後に、WordpressなどのPHPスクリプトで動的なページでは、先頭にも書きましたが、
header("Expires: ".gmdate("D, d M Y H:i:s",time() + 60*60)." GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:S", time())." GMT");
|
が必要になりますので、注意してください。
Expires : の指定は、ここでは、 60(秒)*60(分)なので1時間の有効期限になります。1日1回程度の更新なら、60(秒)*60(分)*24(時間)程度のキャッシュでも良いかもしれませんね。ご参考までに。
コメントを投稿 :