tweet:2018:1109_01
nginx tips (20181109)
この記事はあくまでメモです。もう少し整理したら、nginx関連のPageに記載します。
WordPressやDokuwikiでサイトを作成すると、ある条件ではcacheしてほしくないとかある条件ではupstreamを固定したい(冗長化している場合)という要望に出くわすことがある。
この場合、本質的には、条件によって upstream を切り替えるという作業が必要になる。
WordPressの場合
WordPressの場合、/wp-admin や /login.php へのアクセスは、Cacheしたくないし、できれば 代表サーバーにアクセスを集中させたい。
upstream EXAMPLE {
ip_hash;
server 192.0.2.1:80 max_fails=3 fail_timeout=3s;
server 192.0.2.2:80 max_fails=3 fail_timeout=3s;
server 192.0.2.3:80 max_fails=3 fail_timeout=3s;
}
upstream EXAMPLE_ADMIN {
server 192.0.2.1:80 max_fails=3 fail_timeout=3s; # /wp-adminへのアクセスはここにまとめる
server 192.0.2.2:80 backup; # もし 1 が死んでいる場合、2に。
map $UpStreamFlags $MYUPSTREAM {
default http://EXAMPLE;
ADMIN http://EXAMPLE_ADMIN;
}
server {
....
location ~* ^/(wp-admin|wp-login.php) {
set $UpStreamFlags ADMIN;
proxy_pass $MYUPSTREAM;
....
}
location / {
set $UpStreamFlags "";
proxy_pass $MYUPSTREAM;
....
}
}
これで、 wp-admin.* と wp-login.php.* へのアクセスは EXAMPLE_ADMIN になる。
DokuwikiのCookieを利用した制御
- Dokuwikiは、クッキーにあるように、DokuwikiはCookieを3種類利用する。
- DW<md5-hash>
- (
^DW[0-9a-f]*) 認証に使用 (以下認証クッキー) - DOKU_PREFS
- ユーザーの好みを覚えておく
- DokuWiki
- PHPのセッション識別子
- 認証クッキーを利用して、以下の処理を行う
- 認証された者のアクセスは、コンテンツキャッシュを行わない
- 認証された者のアクセスは、接続先を固定する
- 認証済みかどうかの判断を map で行う
# for Authorization with cookie map $http_cookie $http_authorization { default 0; ~.*DW[0-9a-f]+=.* 1; } - proxy_passを認証済みかどうかで切り替える
if ($http_authorization = 0 ) { proxy_pass http://EX_DOKU; } if ($http_authorization = 1 ) { proxy_pass http://EX_DOKU_AUTH; } - 認証済みの時のCacheを切る
proxy_cache_bypass $http_authorization $nocache_dokup; proxy_no_cache $http_authorization $nocache_dokup;
これで、認証されているかどうかでupstreamを切り替えることができるようになる。
ここで、if文を利用するのは気分が悪いが、このためにさらにMAPを利用すると、mapの制御順序などできっと迷うので、そこは諦める
Tips
Cache関連の設定で、Set-Cookie Headerが付いてくる時に強制Cacheするなら、
proxy_ignore_headers Set-Cookie; # (1) proxy_hide_header Set-Cookie; # (2)
をcache関連の部分に投入することが必要になる。
(1)の設定だけを行う例をしばしば見かけるが、(1)は、「Cookieの値を無視してCache処理する」ことになるので、CacheにCookieが記録されてしまう。(2)を利用することで初めて、CookieをCacheに残さなくなる。
tweet/2018/1109_01.txt · 最終更新: by seirios
