現在稼働中のサーバの仕様変更(キャッシュ非対応→リバースプロキシ)をしようとしたところ、思いがけないところでつまづいたりして結局今回は断念したので念の為のメモ。
元の仕様は以前私が書いたさくらのクラウドに Nginx + PHP-FPM + MariaDB の環境を作る
ここから、Nginx をリバースプロキシにしてサーバにキャッシュを置く仕様に変更しようとした。
前置き
仕様変更前の Nginx の default.conf
は、過去に私が書いたものに次の3行が加えられている。
1 2 3 |
listen 443 ssl; ssl_certificate /etc/letsencrypt/live/example.jp/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.jp/privkey.pem; |
これを、先日私が書いた Nginx をリバースプロキシに対応させる に同じく上記が加わったものに書き換えた。上記の表記が入るのはリバースプロキシ側(ポート80の方)。
当然 nginx.conf
も書き換え、次のコマンドを実行。
1 2 |
nginx -t systemctl restart nginx |
当該サイトは運用途中からSSL化した都合上、WordPress の Really Simple SSL プラグインで SSL をウェブサイトに適用している。
作業による影響
最初は問題なく思えたが、どうやら何かのプラグインが邪魔をして Cache-Control:max-age=0
の他に Cache-Control: no-cache, must-revalidate, max-age=0
が出力されてしまっている。
これはCache-Controlというプラグインで制御できるはずだが、全ての項目を max-age=0
にしても出力結果はなぜかかわらなかった。このときは確認を忘れていたが、後の作業中にもしかしたらブラウザのキャッシュだったのかもしれないと気づく(ちょっと考えにくいが)。
プラグインで解決できなかったので、運用中のサイトではあるが一旦すべてのプラグインを止めてみようと思いつく。
このとき、 Really Simple SSL プラグインも含めて全てを止めてしまった。
もしかしたら、これはそれほど重要なことではないのかもしれないが当該サイトのSSL化を担っている重要なプラグインなので、止めないほうが良かったかもしれない。
怪しくなる空気…
先程止めたプラグインを全て有効化しなおして、最初は問題なく思えた。
つまり、プラグインの無効化→有効化で不要な方の Cache-Control はどういうわけか分からないが解決されたかのように見えた(のちに判明するが、不要な Cache-Control は生き残っていた)。
しかし、Really Simple SSL で301リダイレクトをしているにもかかわらず、 http://example.jp/ から https://example.jp/ へリダイレクトされなくなっていることに気づき、とりあえず Nginx の default.conf
に 301リダイレクトのおまじないを書いた。
リダイレクトループ発生
すると、トップページでリダイレクトループが発生。
HTTPではアクセスできるが HTTPS ではアクセスできない(リダイレクトループ)という状況が生じた。
しかも、Really Simple SSL プラグインの影響で下層ページは HTTP も HTTPS もアクセスできない。そのあたりは、下記サイトを参考に修正を試みたが解決には至らなかった。
https://qiita.com/hirror/items/bb96e236c3ffc41e890e
いま改めて読んでいて見落としがあった。
proxy_set_header X-Forwarded-Proto https;
を書いていなかったので、それを書いていればまた違った結果になったかもしれない。
https://qiita.com/sygnas/items/a2ffa7b3c858c3f557c8
http://totutotu.hatenablog.com/entry/2016/01/27/134708
※これらのページの執筆者を批判するつもりはありません
もう記憶が曖昧&原因がよくわからない…
何かの拍子に、トップページは HTTPS で表示できるようになった。しかし下層ページや管理ページはまだアクセスできない。そして、この時点でスマホのトップページが HTTP も HTTPS もリダイレクトループでアクセスできなくなったことに気づく。この作業を初めてからこれに気づく前までは、 HTTP ではアクセスできていた。
この時点でスマホに関係ありそうなところは唯一、Nginx をリバースプロキシに対応させる の
1 2 3 |
if ($http_user_agent ~* '(iPhone|iPod|incognito|webmate|Android|dream|CUPCAKE|froyo|BlackBerry|webOS|s8000|bada|IEMobile|Googlebot-Mobile|AdsBot-Google)') { set $mobile '@mobile'; } |
この部分のみ。しかしこれは、キャッシュの操作に関係する部分でリダイレクトループとは関係ないはずだ。
一応、試しにここをコメントアウトしてみると・・・スマホでのアクセスが回復した。意味がわからない。
このほか、何かのタイミングで HTTPS での管理画面へのアクセスが復旧し、何かのタイミングでサイト全体が HTTPS で閲覧できるように復旧した。しかし、HTTP でアクセスした際の HTTPS への転送が復旧していない。いちばん大切な部分だ。
仕方がないので、Nginx の設定ファイルを今回はバックアップを取ってあった元の状態に戻した。
すると、(設定ファイル上には301リダイレクトを書いていないのに) HTTP から HTTPS への転送が復活した。
改めて、何が原因なのか調査していきたい。
2,3点書き落としている部分がある気がするけど、今日はここまで。
参考になりそうなサイト(随時追加)
NginxでWordpressのSSL化をすると無限ループに陥るのを回避するには | 初心者でも出来る!CUIでサーバー管理
もう少しあったが失念。。。