ブログサーバreplace
当ブログサーバですが、諸事情によりreplaceしました。その理由は、これから下に書いて行きますね。
replaceした理由
このブログサーバですが、数点不可解な点があって、何が悪いのか?どうなっているのか?ずーーーーと調査していた案件があります。見た目は普通に何もないですが、ある特定の条件下の元発症するのです。
発症する構成図
どこにでもあるNAT環境です。グローバルIPと言われるいわゆる外部からアクセス出来るIPアドレスは、1つでルーター配下は、全てプライベートIPを振って、ポート番号でアクセス元とアクセス先を紐付けて通信させます。
出典:http://www.geekpage.jp/technology/nat/whatis-nat.php
この時、PC1・Android1・iPhone1・Android2・iPhone2と5台例えば、このブログサイトに接続してみます。
○PC1 通信出来る ×Android1/Android2 ×iPhone1/iPhone2 通信出来ない。
不可解な現象
何かの拍子にiPhone1を再起動して、ブログサーバに接続すると、おぉ!なんか接続出来る様になった。もしくはは、Routerを再起動させて一発目はAndroid1で接続すると接続出来る。iPhone1は接続出来ない。Android2は接続出来ない。PCはいつも何も無く接続出来る。一度接続出来なくなると、もうずーっと出来ない。そして、ソフトバンクとか、ドコモとか、AUとかの3G・4G回線から来ると、問題なく接続出来る事。厳密に言うと回線業者によってちょっとまた色々あるので下に書きます。なぞやぁ!これ本当にハゲそうです。
そして分かったんです。
上の構成図で、NATの原理をちょっと書くと、ローカルIPに192.168.1.10(PC) / 192.168.1.11(Android1)/192.168.1.12(Android2)/192.168.1.13(iPhone1)/192.168.1.14(iPhone2)と仮定して、外に出るグローバルIPは、111.111.111.111とします。
PCからこのブログサイトに接続します。192.168.1.10 -> 111.111.111.111にRouterで変換される、その上でDNSサーバに当ブログのドメインを聞きに行く。このブログサーバは、Address: 133.18.171.141がこれなので、このグローバルIPに対して接続を行う。
ブログサーバは、アクセスしてきた端末に対して、htmlをコンテンツを111.111.111.111に送信する。その上でRouterが111.111.111.111に戻ってきた通信を、NATテーブルを元に192.168.1.10に送り届ける。
これが、概ねの動作概要になるのですが、複数端末が同じブログサイトにアクセスにきた場合、どうでしょうか?下記の様な構図ができあがりますね。
PC1———————–> Ruter 111.111.111.111 -> Blog Server
Android1 ——————>
Android2 ——————>
iPhone1 ——————->
iPhone2 ——————->
Blogサーバからしてみると、同じIPに何度も同じパケットを送っていると思い出す訳であって、そこでふと考える訳です。あれ?もうさっき送ってきたパケットより古い物はもうパケット送んなくていいや!って思い出してパケットは破棄する訳です。
もうお分かりですか?
Linuxには、tcp_tw_recycleという仕組みが用意されています。
そのそも、それってなによ?って話なのですが、TIME_WAIT状態のソケットを高速に再利用するためのLinuxカーネル特 有の仕組という事らしいです。
こいつを有効にした時、同じグローバルIPからの同時に接続した時、TCPパケットにタイムスタンプ情報が入っている場合(Android・iPhone共に付加して送っているそうです)、同 時にパケットを送ると、古いタイムスタンプの方のパケットが破棄されます。
不可解だった、一度接続出来なくなると、もうずーっと出来ないのは、いつまでたっても端末は同じ速度で時間が過ぎて行きます。Android1にしてもiPhone1にしても、同じ1秒は1秒なので、それが逆転する事はありません。よって、接続出来る場合は、ずーっと接続出来るし、接続出来ない端末はもう接続出来ないんです。
パラメーター変更したら良いじゃん
じゃあ!このパラメーターを変更すれば良いじゃん!そうなんです。とっととやってしまいましょう。
CentOS7だと下記のコマンドを打つと出来るんですよ。できるんでよねぇ・・・。
root権限がないと出来ないって!?いや、このユーザrootだしな・・・。そして、悟ったんです。このスーパーバイザー的なアカウントじゃないとパラメーターいじれないんじゃ!?
そうなんです。このブログサーバVPSを借りて居るので、VPSのホストサーバの設定に引きずられるんですよ。この仮想化ソリューションでは、もう絶対にいじれない神の領域なんです。という事で、replaceする事にしました。思い立った時が、replaceのタイミングなんで、とっととやってしまいましょう。
replaceを開始
ちょうど、ひな形のスナップショットを作成するチャンスだったので、監視エージェントとかjenkinsスレーブとか全部入れてひな形化して、スナップショットとった後でブログサーバに設定する事にしました。
WordPressのデータをtarで圧縮してローカルPCにダウンロード。mariaDBの設定全部まるっと、dumpとってローカルPCにダウンロードして、該当サーバへ移設する。必要なPackageを入れてWebサーバに仕立てる。dumpを戻したり、zabbixの個別設定をしたりして、昨日2時間くらいで別のサーバで稼働させてDNSを書き換える。間もなく24時間くらいが経過して、やっとアクセスは新サーバの方に移りつつある。完全に通信が止まったらインスタンス削除して完了。
番外編
通信回線の業者に寄って、グローバルIPを付与しない業者も時折あります。なので、NAT環境のでかい版と考えてもらうと、そこの通信業者で私のブログを見てくれている方がいらっしゃいましたら、同様に起動時間の古い方は繋がらないという事が想定されます。また、ドコモもグローバルIPはふるものの、複数端末にグローバルIPを振る方式を採用している為、同様の事象になる可能性があります。
よって、1つでも、2つでもアクセスしようとされた方が接続出来ない状況を避ける為、replaceと相成りました。
1つ、エラーログに大量にログを書かれているのは認識していたのですが、それも先ほど1つのPackageがインストールされていない事により発生している事と、php.iniを移行するのすっかり忘れてて、php.iniがありませんでした・・・org それでも、普通に動くんですねw全部デフォルトって事だったんでしょう。日本語の処理が上手く出来ないってエラーだったので、すぐ気がついたので良かったですけどね。