nginxの古いバージョンはDNSのTTLを無視するっぽい

非常にレアなケースですが、僕はそのケースにヒットどころかホームランしてしまったのでブログに残しておきます。

どうやら、nginxの1.1.9以前のバージョンだとDNSキャッシュを独自で持ってTTLを無視する動作をします。
nginxのCHANGEには以下のように記述されています。

Changes with nginx 1.1.9                                         28 Nov 2011

    *) Change: now double quotes are encoded in an "echo" SSI-command
       output.
       Thanks to Zaur Abasmirzoev.

    *) Feature: the "valid" parameter of the "resolver" directive. By
       default TTL returned by a DNS server is used.
       Thanks to Kirill A. Korinskiy.

これに当たるケースとしては、

  • 1.1.8以前のバージョンを使っている
  • 何かしらの理由でnginxが名前解決している

場合です。
で、注意して欲しいのはepel経由でnginxをインストールしている方。
今見たらepelで配布しているnginxは1.0.15なので気をつけて下さい。

例えば、例えばですよ!?こんなシーンの時に問題になりそうですね!

  • CentOS(5系、6系問わず)を使ってepel経由でnginxをインストール
  • DNSを利用した内部or外部接続している
  • DNSのAレコードorCNAME等を変更した

こんな事になったらnginxはDNSキャッシュを持ち続けるので接続出来なくなりますね!
更に言えば、こんな時にも問題になりそうですよ!

  • nginxとELBを使っている

きゃー!たいへーん!

結論

nginx.orgの公式からインストールしましょう。
公式からrpmを配布していますし、yumリポジトリを追加すればyumコマンドで一発インストールできますよ。