キャッシュは全消しでいい気がしてきた。
wordpressに新規投稿すると、pagedで区切られた投稿表示ページが全部ズレる。
だから、index.php/\?*のキャッシュを消すのは必須で、それと投稿ページのpermalinkだけ消すのが正しい道。
面倒なのは、添付した画像。
こっちは、wordpress上で消したとしても、キャッシュの有効期限までは残ってしまう。
これもプラグインで特定して個別に消した方がキャッシュの効率はいい。
更新頻度が高く、アクセス数も膨大なら個別に消すほうがいいんでしょうが、ノーマルのnginxで投稿時にキャッシュを消すなら、単純なプラグインで全消しも悪くないかな。
<?php
/*
Plugin Name: Nginx Proxy Cache remove
Plugin URI:
Description: remove Nginx Proxy Cache.
Version: 0.0.1
Author: yoshiaki nanba
Author URI: http://www.white-room.jp
*/
function wpremove_nxcache($post_id) {
/* $post_idはキャッシュ特定の日が来るまで飾り */
$cmd = 'rm -rf /var/cache/nginx/whiteroom/*'; /* 俺環超決め打ち */
exec($cmd, $arr, $res);
/* 以下、投稿時に成功、失敗をダッシュボードに返す日が来るまで飾り */
if ($res === 0) {
return true;
} else {
return false;
}
}
add_action('publish_post', 'wpremove_nxcache'); /* 投稿を公開 */
add_action('publish_page', 'wpremove_nxcache'); /* 固定ページを公開 */
add_action('publish_to_draft','wpremove_nxcache'); /* 公開していたものを下書きに戻す */
add_action('edit_comment','wpremove_nxcache'); /* コメントが追加削除変更された */
?>
んぎなんとかでreverse proxy 3 はコメントを受け付けていません
トップページのrssリーダにfile_get_contentsを使っていたのですが、nginxがgzipされたキャッシュを返すので、file_get_contentsでは対応できないため、curlで引っ張る方法に変更しました。
file_get_contentsからcurlに変更。 はコメントを受け付けていません
ubuntuにtalkを入れる。
talk,talkdを入れると、openbsd-inetdも一緒に入る。
- /etc/hosts.allowに、in.ntalkdを許可する。
- ログインユーザ同士でしか使わないので、127.0.0.1だけ許可。
- netstat -nulでntalkdがlistenされているのを確認。
- 日本語対応はeuc-jpのみっぽい。utf-8のままだと使えない。
- あとは、talk user、talk ttyとかそんな感じで開始。
ubuntuでtalk はコメントを受け付けていません
記事作成時にプレビューが効かないのは、WordPress Nginx proxy cache integratorにわかりやすい設定例があって、それを、nginx公式リファレンスを見ながら書き直したら、おおむね予定通りになりました。
ここは、/以下にいきなりwordpressを置かず、他のディレクトリもある、wordpress推奨(ってわけでもなさそうだけど、プラグインなんかに、その仕様で決め打ちしてあるものがある)の構成ではなく、キャッシュさせたくないディレクトリもあるので、スルーの設定がいまいち分らなかったのですが、公式のlocationの項目を見ると、
- location = / — /だけにヒットする。
- location / —/以下ぜんぶが対象
以上が特別なもので、以下、
- location ~* —大文字小文字を区別しない正規表現
- location ~ —大文字小文字を区別する正規表現
で、ファイルやディレクトリを指定すれば良いようです。
proxy_cacheなんたらを書かず、proxy_passだけ書けばバックエンドに飛ばされます。
##backendのapache2を指定
upstream my_backend {
server 127.0.0.1:xxxx weight=1 fail_timeout=10s; --ここはバックエンドが一つなのでweight,fail_timeoutは飾り
}
server {
#################
# その他、必要な設定
#################
#以下、除外設定
#/が更新を拾ってくるphpなので、常時バックエンドから
location = / {
proxy_pass http://my_backend;
}
#wordpress以外のページは常時バックエンドから
location [regex] {
proxy_pass http://my_backend;
}
}
これで、除外設定もぼちぼち。
あと、edit_postのフックでキャッシュ全消しは企画倒れっぽい……。
edit_postのフックに、下書きとして保存も、自動バックアップも含まれるので、自動バックアップが動くたびにキャッシュが消えるw
さすがにこのままでは消しすぎ……。
publish_post(投稿を公開)、publish_page(固定ページを公開)、publish_to_draft(投稿を下書きに戻す)、edit_comment(コメント追加削除)にフックを掛けることに>
んぎなんとかでreverse proxy 2 はコメントを受け付けていません
nginxのキャッシュ問題は、プラグインで対応。
プラグイン作成はあんまし得意ではないので、自環境でまともに動けばよしとします。
add_action('edit_post', 'hage');
に、
`rm -rf /var/cache/nginx/proxy_cache1/*` /* 俺環決め打ち */
を仕込んで、投稿更新時にサイト全体のキャッシュを消し去ることにしました。
/var/cache/nginx/以下はwww-data(俺環)の所有なので、phpから普通に消せます。
更新されたページ関連のキャッシュだけを選択して消すのが正しいんでしょうが、会社のサイトは新刊情報で、コメントの類いもないので更新の頻度も低く、キャッシュを全部消しても影響は一時的なもので済みます。
nginxのcache purgeモジュールのアクセス制限問題からも逃げられるし、通常のaptで更新できるし、俺環にはちょうどいいかも。
wordpressのedit_postフックはコメント投稿も対象なので、コメントをポストしてもキャッシュが消えます。
しばらくここで試してみよう。
追加メモ。
会社のサーバに仕込む時に忘れてはいけないこと。
- 日付で変わる表示があるので、毎日00:00にキャッシュをクリアするcronを仕込むこと。
- だから、キャッシュの有効期限は1dでいい。
- キャッシュクリア後に403が出ることがあるので、今日の設定のまま使わないこと
超決め打ち。 はコメントを受け付けていません