Nginx 側でも Cookie Notice for GDPR 導入後の対応を行った

スポンサーリンク

 WordPress のプラグイン「Cookie Notice for GDPR」は GDPR 対策に於いて筆者の思うような動作をもたらしてくれた物の、Web サーバー側のキャッシュ制御をちょっと弄ってあげる必要が出てしまったのでその対応を行った。

発生した問題

 Cookie Notice for GDPR の設定より Google Analytics のトラッキング開始を Cookie 使用に同意を得た後とする正しい動作にしたが次のような問題が出た。

  1. 当サイト初回アクセス時には Cookie の同意を求める一文が出る。この時 Google Analytics のトラッキングコードはロードされていないページが呼び出される。
  2. 「1.」で呼び出されたコンテンツが FastCGI Cache にてキャッシュされる
  3. Cookie 使用に同意を得たあとに同一ページにアクセスしても Google Analytics のトラッキングコードがロードされていないキャッシュされたコンテンツが呼び出されてしまう

 これに付随する問題として

  1. Google Analytics のトラッキングコードがロードされるコンテンツが FastCGI Cache でキャッシュされていた場合、Cookie の使用に同意をしていないユーザがアクセスした場合でもいきなりトラッキングしてしまう。

 等という事も発生した。
 要はキャッシュ制御が上手いこと出来ていないという状態に。

その場しのぎの対応

 手っ取り早く Nginx 側の設定より FastCGI Cache をバイパスさせる手段をとった。

    location ~ \.php$ {
        try_files            $uri =404;
        client_max_body_size 512M;
        fastcgi_index        index.php;
        fastcgi_pass         phpfpm;
        include              fastcgi_params;
        fastcgi_param        SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        fastcgi_cache_key    "$scheme$request_method$host$request_uri$is_mobile";
        fastcgi_cache        fcgi.bucci.bp7.org;
        fastcgi_cache_methods GET;
        fastcgi_no_cache     1;
        fastcgi_cache_bypass 1;
        fastcgi_cache_valid  200 1d;
        fastcgi_cache_valid  any 10d;
    }

 fastcgi_no_cache と fastcgi_cache_bypass は条件に応じて 0 か 1 を取るような変数を指定していたが、1 を指定する事で一時的に強制バイパスという事に。

きちんと対応する

 FastCGI Cache 無しでも現状のアクセス数であれば普通に捌ける物の、Load Average が若干上昇したり DB 部分のクエリーが増えたり、Web サーバーとしての応答時間も増えたからきちんと対応を考えた。

 要点は Cookie Notice for GDPR を用いて Cookie 使用の同意を得る前後のキャッシュ制御を正しく行うこととなる。
 ではどう実現するかと言えば Cookie Notice for GDPR で用いられる Cookie の有無に応じてキャッシュを分けるという事を行う。

 Cookie Notice for GDPR で使用される Cookie は cookie_notice_accepted という名前なので、この項目を元にフラグとなる変数を定義してセット。fastcgi_cache_key の定義に追加してあげる。

    set $is_gdpr 0;
    if ( $http_cookie ~ cookie_notice_accepted ) {
        set $is_gdpr 1;
    }

 ここでは $is_gdpr という変数を定義して初期値は 0 を与えた。
 そして Cookie の使用同意を得た後にセットされる Cookie 「cookie_notice_accepted」の存在があれば $is_gdpr に 1 をセットするという動作に。

    fastcgi_cache_key    "$scheme$request_method$host$request_uri$is_mobile$is_gdpr";

 そして FastCGI のキャッシュキーに用いられる値に $is_gdpr を追加しておく事で Cookie の有無で異なるキャッシュをする動作としてあげる。
 キャッシュされたかどうかの確認には add_header X-Cache $upstream_cache_status; を適当に追加してあげてブラウザ側から HTTP ヘッダを覗いてあげたりするのも分かりやすくて良いかも。

 このキャッシュキー設定により、当サイトでは「PC 若しくはモバイル端末」で 2 パターンのキャッシュ。Cookie の使用可否で更に 2 パターンの合計 4 パターンのキャッシュを行う動作とした。

更なる今後の対応

 取り敢えず記事に書いた内容で表向きには何の問題のない動作をするように調整する事は出来た。
 あとは内部的に WordPress の記事を更新したりコメントが付いたときにキャッシュをパージする必要があるのだが、その処理をまた弄らなくてはいけない。これは FastCGI のキャッシュキーを変更した為だ。

 FastCGI なりキャッシュを用いればサーバーの負荷軽減にもなるしアクセス速度も向上するが、良い事ばかりではなくてこうしたキャッシュ制御がとても難しいので扱いも面倒い。
 まだ暫くは内部的な調整が必要となりそうで憂鬱だ。

スポンサーリンク