ブログのサーバーをnginx + Apache環境に移行した
大晦日が近いということで、ずっと先延ばしタスクになっていた「ブログサーバーに nginx を入れる作業」に着手。バーチャルホストが9個のってるサーバーだったのでめんどくさかったのですが、ほぼ完了して nginx + Apache の環境になりました。
nginxのvirtual.confを設定してすんなり移行できるかなと思ったら、9サイトのうち肝心のブログだけがなぜか正常表示できず、Apacheのデフォルトページに飛ばされたり、エラー画面になったりしてハマった。
Apacheのエラーログを見てみると「Request exceeded the limit of 10 internal redirects due to probable configuration error. Use ‘LimitInternalRecursion’ to increase the limit if necessary. Use ‘LogLevel debug’ to get a backtrace.」というエラーメッセージが。
どうやらリダイレクトがループしている?ああもしや mod_rewrite か、そういえば、ということをようやく思い出して、.htaccessに書かれていた RewriteRule をとりあえずばっさり削除すると、ようやく正常に表示することができました。
他には location でルールを先に指定しているのに、なぜか後で指定しているルールにマッチするという問題に遭遇するも、「nginx – locationの文字列と正規表現の優先順位 – うまい棒blog」や「nginx連載5回目: nginxの設定、その3 – locationディレクティブ – インフラエンジニアway – powerd by HEARTBEATS」のおかげで解決。
RewriteRuleは大丈夫そうなものだけ .htaccess に残して、あとは virtual.conf の server 設定内に移行しました。
これでほぼ大丈夫かなと思ったら、ApacheのアクセスログにIPアドレスが記録されていない。調べてみると nginx の設定の方法のエントリーによく説明されている proxy_set_header と mod_rpaf の設定でできるとあって、それはとっくに設定済みなのになぜ・・・?
と思ってよくよく設定を見てみると、nginx.conf のdefaultのserver設定の中に記述してしまっていたというオチ。これは virtual.conf のほうでバーチャルホストごとの server 設定内に書くか、nginx.conf の http のほう(serverより1レベル上)にまとめて書くかしないといけなかった。というわけで無事IPアドレスも記録されるようになりました。(「HOWTO: Log Client IP AND X-Forwarded-For IP in Apache – Techstacks HOWTO's」とか参考にした。)
これでブログの特定記事のアクセスが急増したら静的ファイルに置き換えて nginx で返させるということができるな、と。大晦日に向けて負荷対策完了。
コメントを残す