転載・引用について

ユーザ用ツール

サイト用ツール


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に残さなくなる。

このウェブサイトはクッキーを使用しています。 Webサイトを使用することで、あなたはあなたのコンピュータにクッキーを保存することに同意します。 また、あなたはあなたが私たちのプライバシーポリシーを読んで理解したことを認めます。 同意しない場合はウェブサイトを離れてください。クッキーに関する詳細情報
tweet/2018/1109_01.txt · 最終更新: 2018/11/09 19:26 by seirios

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki