【メモ】Nginxでキャッシュが効かない問題をやっと解決

昨日から丸一日以上悩んでいた問題が解決したかも。

今回proxy_cacheではなくfastcgi_cacheでNginxのサーバーを建ててWordpressを動かそうとしていた。

なぜかキャッシュが効いていないことに気が付く。初めてのfastcgi_cacheなので何か設定を間違っているのではないかと色々な記事の設定をみて試してみるが駄目だった。

下記の記事などを参考にして色々試してみる。

add_header XCacheStatus $upstream_cache_status;
を追加すればヘッダーにキャッシュにヒットしているかどうか判断することが出来ることがわかる。
まあ、キャッシュディレクトリを監視していればキャッシュが作られているかどうかはわかりこっちのほうが確実ではあるが、両方チェックした。

 

nginxのproxy_cacheが効いていなかったお話 – とあるサーバエンジニアの備忘録(https://aftercore.net/2017/08/13/nginx%E3%81%AEproxy_cache%E3%81%8C%E5%8A%B9%E3%81%84%E3%81%A6%E3%81%84%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%8A%E8%A9%B1/)

しかし参考にした記事に落とし穴があった。

問題の切り分けでヘッダーを無視する設定を試すのに

proxy_ignore_headers XAccelRedirect XAccelExpires CacheControl Expires Vary;

とあったので

fastcgi_ignore_headers XAccelRedirect XAccelExpires CacheControl Expires Vary;
として、試したが効果がなかった。

もう何が何だかわからなくてあきらめかけていたころ下記の記事を見ていて

[WordPressでnginxのプロキシキャッシュが効かない問題が解決 | 経験知](https://keikenchi.com/nginx-proxy-cache-not-work)

もしかして、

proxy_ignore_headersとfastcgi_ignore_headersの両方を設定したらキャッシュしないかなー?と思って試してみる。

fastcgi_ignore_headers X-Accel-Redirect X-Accel-Expires Cache-Control Expires Vary Set-Cookie;
proxy_ignore_headers X-Accel-Redirect X-Accel-Expires Cache-Control Expires Vary Set-Cookie;

と両方設定に追加した。

キャッシュできた・・・。
もしかして、Nginxのバグなのそういう仕様なの?と誤解する。

ためしに
proxy_ignore_headers X-Accel-Redirect X-Accel-Expires Cache-Control Expires Vary Set-Cookie;
だけにしてみる。
あれ、キャッシュしない。

ためしに
fastcgi_ignore_headers X-Accel-Redirect X-Accel-Expires Cache-Control Expires Vary Set-Cookie;
だけにしてみる。

あれ、キャッシュした。

どゆこと?

良く見比べてみると、

最初に試したのはで

fastcgi_ignore_headers XAccelRedirect XAccelExpires CacheControl Expires Vary;
後で試したのは
fastcgi_ignore_headers X-Accel-Redirect X-Accel-Expires Cache-Control Expires Vary Set-Cookie;
だ。
何が違うかというと、

Set-Cookieが増えている。

あれれー。もしかしてこれが犯人?

犯人が分かれば色々情報が出てくる。ネットでNginxがキャッシュされないというキーワードで検索するとキャッシュ制御のヘッダーやメタタグの話ばかりが出てくるが、実はNginxのレスポンスにCookieが含まれている場合もキャッシュが保存されないらしい。そのことに知らないのでハマったわけである。

キャッシュコントロールのヘッダーばかり探したり見たりしていても解決しないわけだ。

set-cookie: multi-device-switcher=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure

ヘッダーにこのヘッダーがあることは認識していてexpiresのMax-Age=0というのは気にはなっていたのだが、クッキーだしと思っていたし、まさかCookie自体がキャッシュをじゃましていたとは知らなかった。

で、犯人は誰という事でクッキーを見たらそのまんまだけど、multi device switcherという端末ごとにテーマを切り替えるプラグイン。主にスマホとPCで見た目を切り替えるために利用する。これが犯人。

multi device switcherを使うのが初めてだったのも原因、今まではWPtouchを使っていた。

というか、set-cookieのヘッダーが気になったときに一度プラグインを無効にして試したことはあったのだが、

管理者ログインしていたまま試してたのでやっぱりキャッシュされずに関係ないと思い込んでいた。

管理者ログインしているとそれこそno-cacheのヘッダーが追加されてキャッシュされないwwwwアホや。

[Nginx プロキシキャッシュでクッキーがついていてもキャッシュするには] https://qiita.com/koseki/items/7965e1ece0621ec18f64

上の記事によると
proxy_hide_header Set-Cookieも一緒に指定しないとセキュリティ的に問題があるらしい。
fastcgi_hide_header Set-Cookieを追加した。

とりあえずキャッシュできない問題は原因が判明した。
ただfastcgi_hide_header Set-Cookieを指定するとクッキーが効かなくなるんじゃないかと思うので不具合が出そうだからもう少し検証が必要。

まあ、キャッシュをするなったことで、PCとスマホでたぶん先にキャッシュしたほうが表示されるようになってしまうと思うので、キャッシュの制御を追加する必要がありそうだ。それは今からやる。

まあ、ちゃんと理解しないで適当にやってるのが問題なんだけどね。

追記:2018年09月23日 14時42分
fastcgi_hide_header Set-Cookie;はやっぱりいらない気がする。キャッシュを覗いてみた限りでは問題のある情報は残ってないし、wordpressで利用する分には必要ないかな?管理者のアクセスはキャッシュしないようにNginxの設定で制御するようにするからたぶん問題になるようなことはない?
とりあえず、モバイルとPCからのキャッシュを切り分ける設定を追加すればあとは問題なさそうな気がス。

(Visited 1,707 times, 1 visits today)

タグ :