[ SERVER ]
Linux
SoftBank 携帯向けの Web サーバー設定で注意すべきこと
2010/08/07 Tomohiro Kumagai
□ SoftBank 携帯用サイトを運用する場合
なにやら、SoftBank ケータイから Web サイトを閲覧しようとしたときに、Web サイトがうまく表示されない場面というのがあるようです。
その場面というのは 2 つあるようで、ひとつは、Web サーバーへ到達できないというもの、もうひとつは "WJ46150E"
と画面に表示されて、肝心の Web サイトを見ることができないというものの様子です。
具体的なシーンを見ていないので、現象、対応策ともに不確かな情報でもありますが、インターネットで検索するとけっこう話題になっている感もありますので、SoftBank
ケータイからのアクセスも対象したサイトを運用したい場合には、これらについて考慮しておく必要があるかもしれません。
以下ではそれらについて、調べて理解できた範囲で記しておこうと思います。
□ SoftBank ケータイから Web サーバーへ到達できない場合の可能性
SoftBank ケータイから Web サーバーへアクセスした際に、Web サーバーまで上手く到達できないことがあるらしいです。
それについてインターネットで調べてみると、その原因として "PMTUD ブラックホール"
という現象が挙げられていました。
詳しく調べた際のお話は Path MTU
Discovery と PMTUD ブラックホール の方に記してみましたが、要は、Web サーバーへ到達するまでのネットワーク経路で 1
度に送信可能なデータ量を検出する仕組みがうまく働かないために、適切なデータ転送が行えない状況に陥ってしまうみたいです。
この 1 度に転送可能なデータ量のことを MTU (Maximum Transmission Unit) と呼ぶのですけど、これが原因で Web
サーバーへ到達できない場合には、何らかの方法で、1 回の通信におけるデータ量を、その経路上を通過できるデータ量に抑える必要がでてきます。
そのためには、経路上のルーターで Path MTU Discovery による MTU
最大値を伝えるための返信パケットを破棄しないようにしたり、同じく経路上のルーターの MTU
値を引き上げるなどの対応が考えられますが、第三社が管轄する機器に手を出すというのはそうそう現実的な話ではありません。
しかしながら、幸いにも Web サーバーの場合は TCP を利用しています。
TCP は、クライアントとサーバーが通信を開始する際に、3-way ハンドシェイクの流れの中で、TCP データとして受付可能なデータサイズ MSS
(Maximum Segment Size) を取り決めることが出来るようになっているそうです。
すなわち、その際の MSS のサイズを指定することで、MSS とそれに付加される TCP ヘッダー 20 バイトと IP ヘッダー 20
バイトを加えた MTU に相当するデータサイズを、その途中経路で転送可能な大きさに調整することが可能になります。
この MSS を、自身が管轄している Web サーバーのネットワークインターフェイスに設定することにより、クライアントから送られてくる 1
回あたりのデータ量を適切に調整することが出来るようになるようです。
調べてみると、SoftBank ケータイからのアクセスの場合は MTU 値が 1,300 の経路を通過するらしい情報があったので、Web
サーバーの MTU を 1,300 に調整すれば、問題が解消できるのではないかと思われます。
Linux の場合には、ネットワークインターフェイスの MTU 値を調整すれば、自動的に適切な MSS
値を選択してくれるとのことですので、設定は次のような感じで行えば良い様子です。
ifconfig eth0 mtu 1300
このようにすることで、インターフェイス eth0 の MTU を 1,300 に変更することが可能です。
CentOS などの Red Hat 系の Linux の場合には、"/etc/sysconfig/network-scripts/"
ディレクトリ内にある "ifcfg-eth0" 等の設定ファイルの中に、次の行を追加することで起動時に MTU の設定を行うことも可能でした。
MTU=1300
ただ、eth0 の他に eth0:1 や eth0:2 といった、eth0 に複数の IP
アドレスを設定している場合には、目的のインターフェイスの設定ファイルに MTU を記載するだけではうまく行かない場合がありました。
ですので、支障がなければ eth0 系の全ての設定ファイルに MTU を記載するか、設定後に再起動して正しく MTU
が反映されているかを確認するなどしておくと良いと思います。
なお、現在設定されている MTU 値は、Linux の場合は "ifconfig eth0" などとすることで、画面上で確認することが可能です。
□ SoftBank ケータイからのアクセス時に "WJ46150E" が表示される場合の可能性
SoftBank ケータイから Web サイトにアクセスした場合に、画面に "WJ46150E" と表示されてしまう場合があるそうです。
これについて原因を調べてみたところ、TCP の設定で TCP_TW_RECYCLE
が有効になっている場合に発生する可能性があるとの情報が見つかりました。
この TCP_TW_RECYCLE というのは、TCP コネクションが終了した後にしばらく残る TIME_WAIT
状態のソケットを早く回収するための仕組みのようです。
同時アクセス数が多くて TCP ソケットが枯渇してしまうような場合に、この TCP_TW_RECYCLE
を有効にすると、ソケットの使用効率が高まって状況改善されるらしいもののようなのですけど、その理由や他への影響範囲について調べてみても
"専門技術者でなければ既定値のままにしておくべき" といった情報ばかりで、実際の理屈については理解できませんでした。
ともあれ、少なくとも CentOS 5.4 の場合は既定値が 0 になっているので、SoftBank
ケータイからのアクセスも期待しているならなおさら、既定値通りの 0 を設定しておくのが良さそうです。
もし、TCP_TW_RECYCLE が 1 に設定されている場合には、次のようにして TCP_TW_RECYCLE を 0
に変更することが可能です。
echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle
Red Hat 系の Linux を使用している場合には、"/etc/sysctl.conf" ファイルに次の行を追加することでも設定可能です。
net.ipv4.tcp_tw_recycle = 0
このように設定したら、システムを再起動するか、コマンドラインから "sysctl -p" を実行することで、設定がシステムに反映されます。
なお、この "WJ46150E" が表示されてしまう原因について調べていたときに、インターネット上では "それは SoftBank
通信網がパンク寸前だから、空いている時間を待たないとどうにもならない"
みたいなことが多くのサイトで見られましたけど、個人的には、これは違うように思います。
仮にもしそうだとすれば、個々では対応策のないどうしようもない状況になりますが、そうだとすれば世の中でもっと大問題になっているように思います。
さらに調べを進めてみると、SoftBank の公式サイトにもこの現象に対する回答が載せられていました。
そこには "ご利用者が多い時間帯などアクセスが込み合っている場合に、該当サイトのアドレスが読み込めない等のエラーコードです。"
と記されていて、これだけ読めば、たしかにパンク寸前と捉えてもおかしくはないような気もします。
ただ、TCP_TW_RECYCLE による解決策を信じるならば、アクセスが多いために TCP
ソケットの回収が必要となっているサイトで、本来であれば何らかの理由で余裕を持って回収すべき TCP
ソケットを、早い段階で回収するようにすることで、その弊害が SoftBank ケータイで発生していると考えることも出来ると思います。
そうであれば、サーバーでの TCP
ソケットを回収する速度を、本来の余裕を持った回収速度に調整してあげることで、この障害が改善される可能性も十分に考えられると思います。
その場合、どちらかといえばですけど、パンク寸前なのは SoftBank
携帯網ではなく、利用しようとしているサービスを提供しているサーバー側ということになりますので、必要以上に SoftBank
を利用することに危機感を抱く必要はないと思います。
ともあれ、現段階では、今回紹介した対応によって SoftBank
ケータイからのアクセスが正常に行えるかどうかを実際に確かめられているわけではないので、この仮説がどこまで的を射ているものなのかどうかについても、分からないところではありますけれど。