Linux入門:コマンド操作のきほん
ネットワークの基礎知識
「つながりません」と言われても、どこも直せない
「本番の API につながらない」と連絡が来たとします。候補は、名前が引けていない、相手まで届いていない、ポートが閉じている、アプリが落ちている、のどれかです。どれも利用者から見た症状は同じ「つながらない」なので、勘で当てにいくと時間だけが溶けていきます。
この章でやりたいのは、ネットワークの理論を覚えることではありません。次にどこを見るかが決まっている状態を作ることです。順番さえ持っていれば、知らないサーバーでも 5 分で切り分けられます。
相手は住所と部屋番号で決まる
通信相手を指す番号が IP アドレスです。203.0.113.10 のような値ですが、人間が覚えるのは無理があるので、example.com という名前を DNS で IP に変換してから使います。名前が IP に変換できているかは、次のコマンドで確かめられます。
ターミナル
getent hosts example.com
# 203.0.113.10 example.comここで何も返ってこなければ、まだ通信は 1 バイトも始まっていません。相手が落ちているのではなく、相手の場所が分かっていないという状態です。
ターミナル
getent hosts api.example.internal
# 何も表示されずに終わる1 台のサーバーは Web も DB も同時に動かします。そこで IP だけでは足りず、ポート番号で相手を絞ります。待ち受ける側があらかじめ番号を決めていて、接続する側はその番号を指定します。IP が建物の住所、ポートが部屋番号だと思ってください。HTTPS なら 443 番、SSH なら 22 番が慣例です。
ターミナル
curl http://203.0.113.10:8080/health # アプリ
curl http://203.0.113.10:9090/metrics # 監視用の別サービス同じ住所でも、番号が違えば別のサービスに届きます。逆に言うと、番号を 1 つ間違えただけで、生きているサーバーに対して「つながらない」という結果になります。
上から順に 4 段で落としていく
つながらないときは、次の順に確かめます。上の段が駄目なら、下の段はどうせ動かないので見るだけ無駄です。
| 段 | 確かめること | 使う道具 |
|---|---|---|
| 1 | 名前が IP に変換できるか | getent hosts |
| 2 | その IP まで届くか | ping |
| 3 | 目的のポートが開いているか | nc -vz ss |
| 4 | アプリが応答を返すか | curl |
たとえば 1 段目で失敗したら、DNS の設定か打ち間違いです。1 段目は通るのに 2 段目で止まるなら経路の話で、サーバー側のアプリを再起動しても何も変わりません。3 段目まで通って 4 段目だけ失敗するなら、ネットワークは正常でアプリの問題です。
この 4 段を口で言えるようになるだけで、障害対応の速さがはっきり変わります。道具は後から覚えれば足ります。順番が先です。