Glide Note

glidenote's blog

Webサーバのメンテナンス、トラブル調査に役に立つコマンド3選

メンテナンス、サーバのミドルウェア設定、障害対応のときに私がよく使っているコマンド。 先週Webサーバを16台ほどリプレイスした際にも、使って挙動、確認作業をしてました。

コレ系のコマンドは各人の秘伝のタレみたいになってて、他の人が教えてくれることが少ない気がして、 新卒氏のインフラOJT用に専用の資料作ろうかと思ったけど、新卒氏以外でも知ってれば 「よく分からんけど、動かないからインフラ担当者に聞く」みたいなことが 減って自分で解決出来るのではないかと思うので書いておく。

手元のmac、linuxから該当サーバに対して実行するコマンドで ちゃんと該当サーバが外部に向けてサービスが提供出来ているのか、 要は外から確認するためのコマンドです。

調査系のコマンドは

  • オプション、使い方が覚えやすい
  • 手軽に使える
  • 結果が見やすい、理解しやすい

というのが重要だと思う。

サーバの中で調査するなら

のコマンドを見た方が良いです。

nc(netcat)

ポートが開いているか、デーモンが起動してリクエスト応答しているか確認。

1
nc -vz github.com 80
1
2
nc -vz github.com 443
Connection to github.com 443 port [tcp/https] succeeded!

今よく触ってるSerfは7946ポートを使うので、他のサーバから下記で接続確認。

1
nc -vz manage001.hogemoge.lan 7946

アラートが来たら、とりあえずnc叩けば 接続過多で駄目なのか、そもそもミドルウェアが落ちてるのかとか サーバ入る前にだいたい検討付くので初動を間違えずに済む。

普段やること無いですが、一応下記みたいな感じでポートスキャンも出来る。

1
nc -vz hogemoge.com 1-1023

最近はtelnetをサーバに入れてないことが多いけど、ncが入ってれば telnetと同様な感じでも利用出来るので、ヘッダをリクエストしたり

1
2
3
4
nc www.google.com 80 << EOF
HEAD / HTTP/1.0

EOF

たとえばmunin-nodeが動作しているか確認する場合は、下記みたいに出来る。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@manage001 ~]# nc manage001.hogemoge.jp 4949
# munin node at manage001.hogemoge.jp
list
cpu df df_abs df_inode entropy forks fw_conntrack fw_forwarded_local fw_packets if_err_eth0 if_err_eth1 if_eth0 if_eth1 interrupts irqstats load memory munin_stats netstat ntp_kernel_err ntp_kernel_pll_freq ntp_kernel_pll_off ntp_offset ntp_states open_files open_inodes postfix_mailqueue postfix_mailvolume proc_pri processes swap threads uptime users vmstat
fetch memory
slab.value 189231104
swap_cache.value 0
page_tables.value 6995968
vmalloc_used.value 119119872
apps.value 936333312
free.value 676610048
buffers.value 247578624
cached.value 1336840192
swap.value 0
committed.value 885620736
mapped.value 31141888
active.value 1401610240
inactive.value 658358272
.
quit

通常は接続元IPを制限してると思うので、許可されているIPと許可されていないIPの二つから確認して、 設定がちゃんと出来てるとかの確認もしてます。

host

サーバの/etc/resolv.confで設定して参照しているDNSサーバ、Google Public DNSとかとの結果を比較をして、 おかしなDNS情報を持ってないか確認したりするのに使ってます。

DNSサーバを指定しない場合は、/etc/resolv.confに設定してあるDNSサーバを利用。

1
host -a github.com

Google Public DNSを参照

1
host -a github.com 8.8.8.8

dnsmasqとか使ってると古い情報をキャッシュしてたりするので、hostコマンドを使うとすぐ分かる。

エンジニアのための時間管理術 から引用で

  • 奇妙な問題は DNS の設定ミスが原因していることが多い

DNS は多くのサブシステムにとって致命的な影響を与え、しばしば、問題を 別の問題であるかのように見せかけ、その問題を覆い隠してしまう傾向がある。 これに該当するのは、DNS サーバーにアクセスできないクライアント、無効 な DNS データが設定されたホスト、または無効な DNS データが設定された ホストにアクセスしようとするクライアントである。

私の経験上でも、意味不明なトラブルはDNS周りが起因していることが多いので、早めにhostdigでDNS周りの調査をします。

http (httpie)

最近はnginxのプロキシ、リプロシキ、ngx_luaの設定ばっか触ってるので、httpieで挙動確認、設定確認をしてます。

CentOS6では下記のように導入。

1
2
yum -y install python-pip
pip install httpie

Macの場合はhomebrew利用してここを参考に下記みたいな感じで導入。

1
2
3
brew install python
export PATH=/usr/local/share/python:$PATH
pip install httpie

curlでも同じ事が出来るんですが、curlは人間に優しくないというか 私がオプションを全く覚えることが出来ないので、こちらを多用してます。 httpieだけでは足りないので、もちろんcurlも重宝してます。

下記の例はヘッダを見てるだけだけど、色が付くだけで見やすくなる。

ヘッダの確認

1
http -h httpbin.org

basic認証の確認

1
http -a hoge https://httpbin.org/basic-auth

リダイレクトの確認

1
http --follow google.co.jp

GETのテスト。defaultがGETなので、GETの場合はmethod指定しなくても良い。

1
http GET httpbin.org/get

PUTのテスト

1
http PUT httpbin.org/put name=hoge key=value

と例を挙げたらキリがないんですが、ApacheやNginxの動作、設定確認なので、 普段はだいたい上記みたいな感じで使ってます。

ちなみにhttp://httpbin.org/を利用するとhttpieの使い方が覚えるのに便利で、 https://httpbin.org/もあるので、ssl系のテストも出来る。

httpieのzsh補完関数は先日pull req出して、zsh-completionsにmergeされているので、httpieご利用の方はご活用ください。

add httpie completion by glidenote · Pull Request #184 · zsh-users/zsh-completions

他にも調査用のコマンドはありますが、nc,host,httpieを使いこなせれば、 サーバ入る前にある程度の事が判断ついて、いろいろと捗ると思う。

Comments