Apacheのキャッシュ(mod_cache)+Wordpressの注意点
Apacheのキャッシュ(mod_cache,mod_disk_cache) 上で WordPressを動かす時の注意点は、案外、多いので、以下に列挙してみました。
phpの問題
Expires
情報がないページは、Apacheのキャッシュ(mod_cache,mod_disk_cache)では、キャッシュされません。
phpで動的に作成されるページには、自動的に、 そのHTTP ヘッダ情報として Expires
が出力されません。
そのため、特に何も設定しない場合には、キャッシュされません。
そこで、対処として以下のように ExpiresActive
, ExpiresByType
ディレクティブを設定すると良いです。
以下は、Apacheの設定ファイル /etc/httpd/conf/httpd.confの設定例です。
...
<VirtualHost *:80>
...
ServerName www.example.com
...
DocumentRoot /var/www/html
...
<Files *.php>
ExpiresActive On
ExpiresByType text/html "access 1 hour"
</Files>
...
<IfModule mod_disk_cache.c>
...
CacheDirLevels 2
CacheDirLength 1
...
CacheDefaultExpire 3600
CacheMaxExpire 7200
...
</IfModule>
</VirtualHost>
...
|
この設定例では、
VirtualHost
内で設定していますが、この設定は、どこでもOKです。また、.htaccessでの設定でもOKです。
また、必ず、expires モジュールが読み込まれていることを確認しておきます。
LoadModule expires_module modules/mod_expires.so
|
キャッシュしてはいけないディレクトリ
Wordpressの場合、キャッシュしてはいけないディレクトリがあります。
- /wp-admin : 必須
→ このディレクトリは管理用なので、このディレクトリをキャッシュしてしまうとログインすらできなくなることもあります。絶対にキャッシュしてはいけません。
- /wp-content : 必要に応じて
→ このディレクトリはテーマやプラグインなどのファイルがあるディレクトリなので、CSSファイル、画像ファイルなどもあります。
ディスクキャッシュの場合は、画像ファイルなどをキャッシュしてもほとんど意味がありませんから、少なくともメモリキャッシュでなければ、キャッシュする意味はないでしょう。
- /wp-includes : 必要に応じて
→ このディレクトリは文字通り読み込み用のファイルがあるディレクトリなので、画像ファイルなどもあります。
ディスクキャッシュの場合は、画像ファイルなどをキャッシュしてもほとんど意味がありませんから、少なくともメモリキャッシュでなければ、キャッシュする意味はないでしょう。
そこで、対処として以下のように CacheDisable
ディレクティブで無効ディレクトリを設定すると良いです。
以下は、Apacheの設定ファイル /etc/httpd/conf/httpd.confの設定例です。
...
<VirtualHost *:80>
...
ServerName www.example.com
...
DocumentRoot /var/www/html
...
<IfModule mod_disk_cache.c>
CacheEnable disk /
...
CacheDisable /wp-admin
CacheDisable /wp-content
CacheDisable /wp-includes
...
CacheDirLevels 2
CacheDirLength 1
...
CacheDefaultExpire 3600
CacheMaxExpire 7200
...
</IfModule>
</VirtualHost>
...
|
パーマリンク設定をパラメータ指定としない場合の問題
Wordpressの場合、URIを独自のアドレスへカスタマイズできます。その設定である パーマリンク設定を変更してしまうと、うまくキャッシュできなくなることがあります。
Apacheを利用している場合、
パーマリンク設定を変更した場合、以下のように.htaccessなどに記述しないさい・・・とうことになっています。
例えば、/var/www/html/ がルートディレクトリ(WordPressがインストールされているディレクトリ)とすると、以下のように設定します。
/var/www/html/.htaccess
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
|
Apacheの設定ファイル
/etc/httpd/conf/httpd.confでは、.htaccess を許可するように設定しておく必要があります。
/etc/httpd/conf/httpd.conf
...
<VirtualHost *:80>
...
ServerName www.example.com
...
DocumentRoot /var/www/html
...
<Directory "/var/www/html">
...
Options All
AllowOverride All
...
</Directory>
...
</VirtualHost>
...
|
Options
、
AllowOverride
をいずれも
All
で .htaccess の設定のすべてを許可するようにしています。
先の RewriteRule
では、最終的にファイルやディレクトリが存在しなうURIへのアクセスは、すべて index.php
へ流れる(リダイレクト)ようになっています。
そうすると、すべてのファイルやディレクトリが存在しなうURIは、同じURLに集約されてしまう(例: http://example.com/index.php )ので、キャッシュも1つに集約されてしまいます。
つまり、どの記事へアクセスしても同じキャッシュが出力されるようになってしまいます。
これを回避するためにパラメータでURIを渡すように変更します。
/var/www/html/.htaccess
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php?p=%{REQUEST_URI} [L]
|
こんな感じで渡してあげると、各記事によってURIは異なるのでキャッシュも別々になります。
おそらくは、上記のイメージでうまくいくことと思いますが、
個人的な確認したパーマリンク設定のパターンも少ないので、利用される場合は、十分なテストを行ってください。
ログイン中の問題
Wordpressにログイン中に記事の確認を行いたいときは、キャッシュしてほしくないのですが、
Apacheのキャッシュ機能は、CacheIgnoreCacheControl
の On/Off ぐらいしか設定がありません。
そこで、Wordpressのログイン中を判断して、リダイレクト、キャッシュをさせないように手を加えてみます。
先の パーマリンク設定をパラメータ指定としない場合の問題 で使った .htaccess を編集してみます。
/var/www/html/.htaccess
1
2
3
4
5
6
7
8
9
10
11
| RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{HTTP_COOKIE} .*wordpress_logged_in_.*
RewriteRule ^$ /index.php?p=&no-cache [L,E=no-cache]
RewriteCond %{HTTP_COOKIE} .*wordpress_logged_in_.*
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php?p=%{REQUEST_URI}&no-cache [L,E=no-cache]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php?p=%{REQUEST_URI} [L]
|
3 – 4 行目:クッキーを参照して、ログイン中ならルートへアクセスしたものをリダイレクトします。
5 – 8 行目:クッキーを参照して、ログイン中ならアクセスしたURI+no-cache を付加してリダイレクトします。
一応、これで記事の参照時は、うまくいきますが、ルートへのアクセス(3 – 4 行目)は、なぜか、うまく動いてくれません。
キャッシュがあるとリダイレクトしてくれません。
んーーーっ、なぜかわかる方、コメントください。
nginxでは、すんなり動いてくれることが、Apacheでは、なかなか動いてくれません。
個人的な理解もありますが、問題も多いことも一つの原因だと思います。
そもそもApacheが機能が多すぎて、機能間での不具合は普通にありますから、
そういう面からすると、最近出てきたnginx , lighttpd , TUX などが機能を絞って安定性があるのも ある意味 当然なのかもしれません。
また、リバースプロキシを考えれば、Squidなどの選択肢もありますから、無理にApacheでやりくりする必要もないとは思います。
とは言ってもレンタルサーバー系は、まだまだApacheが主流ですし、古くからのユーザも多いですからApacheを使用する機会も多いと思います。
上記の悪戦苦闘ぶりが、何かの参考になればうれしく思います。
コメントを投稿 :