レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

C5 C6 S6

Apacheのキャッシュ(mod_cache,mod_disk_cache)を使ってみる

2013年4月10日 2015年5月15日
apache cache

キャッシュ機能あるのは、Nginxだけではありません。 Apacheにもあります。 Apacheでキャッシュ機能を利用するには、mod_cacheを使います。 ただ、このmod_cacheは、以下のような問題があって、かなり扱いづらいので、キャッシュを使いたい場合は、個人的には、ほとんど nginxで管理運営しています。


  • Bug 45273 – mod_dir bypasses mod_cache
    Bug 51057 – mod_disk_cache does not cache URL ending in a trailing forward slash (when DirectoryIndex resource is used)

    (上記2つは、 同一問題として扱われています)

    この問題は、URLのファイル名省略時にキャッシュされないという問題です。
    例えば、
    http://example.com/index.html → OK
    http://example.com/ → NG
    となってしまうという問題です。

    現在のこの問題のステータスは、RESOLVED FIXED となっていて、これによると 2.2.17 以降は、直ったらしいです。

    ただし、以下の項目がヘッダ情報として出力されないかぎりキャッシュはされないので、注意が必要です。
    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 : 満期になる; 終了する; (期限がきて)失効する. というのが直訳で、キャッシュの有効期限を意味します。
    Last-Modified : 文字通り、最終更新日時です。
  • Bug 48364 – PHP-generated pages are not cached in spite of pertinent header entries

    この問題は、PHP-CGI で動的なページがキャッシュされないという問題です。
    例えば、
    http://example.com/index.php → PHPモジュール版 : OK / PHP-CGI版 : NG
    となってしまうという問題です。

    現在のこの問題のステータスは、REOPENED となっていて、一旦、解決となったようですが、再オープンとなった模様で、実際に、最新版の2.2.23 でもキャッシュされません。


最新版であれば、少なくともPHP-モジュール版であれば、Wordpressもキャッシュできるようにはなったようです。
これで、なんとかApacheでどうしてもやる必要がある場合は、このmod_cacheを使うことも選択肢になりそうです。


ということで、そろそろ、一度、記事にしておくのも良いかもしれないと思い、今回は、Apacheでキャッシュ(mod_cache)を使ってみることにしました。
また、mod_cache は、ディスクキャッシュを行う mod_disk_cache と、メモリキャッシュを行う mod_mem_cache の2つがありますが、ここでは、ディスクキャッシュ ( mod_disk_cache ) を使ってみます。

まずは、最新版の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_cachemod_cache の上位モジュール(包含したモジュール)であるためで、 mod_cacheで定義されているディレクティブ情報は、mod_disk_cache でも設定することができるからです。

mod_cacheの設定を行う可能性があるのは、mod_disk_cachemod_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
  1. Apacheは、キャッシュしようとするURL、プロトコルなどの情報を ハッシュ計算した22文字(以降、ハッシュ文字と称す)の情報へ変換します。
  2. ハッシュ文字の長さ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(時間)程度のキャッシュでも良いかもしれませんね。ご参考までに。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

Apacheのキャッシュ(mod_cache、mod_disk_cache)+Wordpressの注意点

ここまでに、Apacheのキャッシュ(mod_cache,mod_disk_cache)について、記事を書いてきました。 Apache ...

Apache でディスクキャッシュを削除する方法をまとめて解説してみた

Apache でキャッシュを削除する方法は、一応、公式なものは、htcachecleanを使っての削除のみです。 Apacheのキャッ ...

Squid + Apache でWordpressを使う時の注意点

ここまでに、Squid のリバースプロキス、キャッシュについて、記事を書いてきました。 Squidをリバースプロキシとして使ってみた ...

Apacheのキャッシュを削除するhtcachecleanを使ってみる

Apacheのキャッシュ(mod_cache,mod_disk_cache)を使ってみる では、Apacheによるキャッシュの設定方法について、 ...

Squidをリバースプロキシとして使ってみた

このサイトでは、リバースプロキシに関して、Nginxを使って実現する Nginx をリバースプロキシ(キャッシュ) として使ってみた という記事 ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2421 [s]