【Nginx】サーバ状況監視ツールメモ

サーバの状況を調べる方法をまとめてみました。主にNginxです。
※ 参考にさせていただいたサイトは一番下に記述しています

##元記事
下記エントリの転載になります。
[【Nginx】サーバ状況監視ツールメモ - rokuro Fire](http://www.rokurofire.info/2014/03/02/nginx_monitor/)

##リソースの利用状況を調べる

#####top

```cmd
$ top

top - 16:10:42 up 10:06,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  75 total,   1 running,  74 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem:   1012128 total,   477528 used,   534600 free,    44504 buffers
KiB Swap:  1046524 total,        0 used,  1046524 free,   134900 cached

 PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 821 mysql     20   0  675m  52m 7272 S   0.3  5.3   0:31.19 mysqld
1065 root      20   0  163m 4672 3728 S   0.3  0.5   0:45.74 vmtoolsd
・・・
・・・
・・・
```

#####vmstat

```cmd
$ vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  0      0 534592  44512 134928    0    0     5     1   32  132  1  0 99  0
 0  0      0 534568  44520 134920    0    0     0    12   32   75  0  0 100  0
 0  0      0 534568  44520 134928    0    0     0     0   27   58  0  1 99  0
・・・
・・・
・・・
```

#####dstat
cpu、メモリ等の情報 ＋ ディスクI/O、ネットワークI/Oなども一気にまとめて見る場合にはこちら。
カラーで出力されて見た目もオサレ。

```
# インストール
$ sudo yum install dstat

# 実行
$ dstat -Tclmdrn

--epoch--- ----total-cpu-usage---- ---load-avg--- ------memory-usage----- -dsk/total- --io/total- -net/total-
  epoch   |usr sys idl wai hiq siq| 1m   5m  15m | used  buff  cach  free| read  writ| read  writ| recv  send
1393744402|  1   0  99   0   0   0|   0 0.01 0.05| 295M 43.5M  132M  518M|4782B  912B|0.24  0.09 |   0     0 
1393744403|  0   0 100   0   0   0|   0 0.01 0.05| 295M 43.5M  132M  518M|   0     0 |   0     0 | 396B 1708B
1393744404|  0   0 100   0   0   0|   0 0.01 0.05| 295M 43.5M  132M  518M|   0     0 |   0     0 | 132B  580B
1393744405|  0   0 100   0   0   0|   0 0.01 0.05| 295M 43.5M  132M  518M|   0     0 |   0     0 | 132B  580B
1393744406|  0   0 100   0   0   0|   0 0.01 0.05| 295M 43.5M  132M  518M|   0     0 |   0     0 | 132B  580B
・・・
・・・
・・・
```

##Nginxの接続状況確認

#####stub_statusを利用

"HttpStubStatusModule"モジュールを有効にします。

```cmd
// 最近のNginxにはデフォルトで組み込まれている
// "--with-http_stub_status_module"が含まれていたらOK
$ nginx -V
nginx version: nginx/1.2.1
TLS SNI support enabled
configure arguments:・・・ --with-http_stub_status_module ・・・
```

```nginx.conf
server {
	listen 80;
	server_name localngcheck;

	location /nginx_status {
		stub_status on;
		access_log off;
		allow 127.0.0.1;
		deny all;
	}
}
```
allow 127.0.0.1 とすることで，サーバ内部からしか見れないようにします（環境によって適宜変更します）。
また、私の環境ではlocalhostだと動かなかったので、hostsに下記のような追記をしました。

```/etc/hosts
127.0.0.1 localngcheck;
```

接続状況の取得は下記コマンドで。

```cmd
$ wget -q -O - http://localngcheck/nginx_status

Active connections: 5 
server accepts handled requests
 136 136 219 
Reading: 0 Writing: 1 Waiting: 4 
```

#####stub_statusのモニタリング

いちいちコマンドを打つのではなく、vmstatみたいに定期的に数値が更新されるようにしてみます。
導入が最も簡単な "nginxstats.py" を利用してみます。

```cmd
# ~/以下に適当なディレクトリを作成し、nginxstats.py をダウンロード
$ wget http://hostingfu.com/files/nginx/nginxstats.py
$ chmod +x nginxstats.py

# envのパスを確認します。
$ ls /usr/bin/env
/usr/bin/env

# pythonのパスが張れているか確認します。
$ which python
/usr/bin/python
```

実行してみます。デフォルトでは30秒に1回更新されます。必ずこのコマンドでの接続数1が発生します。

```cmd
$ ./nginxstats.py http://localngcheck/nginx_status

Conn     Conn/s     Request/s  Read  Write Wait 
-------- ---------- ---------- ----- ----- -----
       4       0.13       0.27     0     1     3
```

また、nginxstats.pyファイルの中身にある下記を変更すると、更新時間を変更できます。

```nginxstats.py
TIME_SLEEP = 30
```



##リクエスト制限（HttpLimitReqModuleの利用）

limit_req_zone、limit_req を設定します。

```limit_req_zone
limit_req_zone $binary_remote_addr  zone=[name]:[size] rate=[rate];

# $binary_remote_addr - 公式でこの変数名
# [name] - ゾーン名（公式では"one"という名称を使っている）
# [size] - ゾーンの最大サイズ
# [rate] - 毎秒/分/時 の最大リクエスト数。この数を超えると503を返す

# httpディレクティブ
```

```limit_req
limit_req zone=[name] burst=[burst];

# [name] - limit_req_zone で設定したnameを設定
# [burst] - limit_req_zoneの[rate]で設定した上限を超えた場合の待ち行列数。ここを設定しないと、[rate]を超えた瞬間すぐに503になってしまう。
# ※ この数値を超えたら503になる

# http、server、locationディレクティブ
```

nginxの設定ファイルに実際に追記してみます。

```nginx.conf
# limit_req_zoneはhttpディレクティブに設定
http {
	limit_req_zone $binary_remote_addr  zone=one:10m rate=50r/s;
	# 毎秒50リクエスト

	server {
		listen 80;
		server_name hogehoge.com;
		limit_req zone=one burst=100;
	}
}

```

##負荷テスト

http_load を下記からダウンロードします。
[http://acme.com/software/http_load/](http://acme.com/software/http_load/)

```cmd
# 適当に作業用ディレクトリを作成
$ cd ~
$ mkdir test
$ cd test

# testファイルにtarファイルを置く
# 展開してインストール
$ tar zxvf http_load-12mar2006.tar.gz
$ cd http_load-12mar2006

# makeにはsudoが必要かも
$ sudo make
$ sudo make install

```

http_load オプション

接続数

```
-parallel 数値
又は
-rate 数値
で指定。

parallel: 同時接続数の指定
rate: 毎秒ごとの新しい接続数の指定
```

接続回数

```
-fetches 数値
又は
-seconds 数値
で指定。
fetches: 接続する合計回数
seconds: 接続する秒数
```

実行コマンド例

```cmd
$ http_load -verbose -parallel 10 -fetches 1000 [URLを記述したファイル名]
```

##まとめ
dstatとnginxstats.pyが導入も簡単でとても便利です。
dstatでリソース/IO状況を見て、nginxstats.pyで同時接続数を見ながらhttp_loadで負荷テストをし、HttpLimitReqModuleの値を調整していく、という感じでしょうか。

##参考サイト様

リソース調査方法関連

* [Linuxサーバの反応が遅い(重い)場合の原因の調査手順](http://www.sakito.com/2012/06/linux.html)
* [dstatの万能感がハンパない](http://d.hatena.ne.jp/hirose31/20120229/1330501968)

stab_status関連

* [nginx で接続状態を確認する(stub_status を使ってみる) - レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/nginx-stub_status-setting.html)
* [Quick Nginx Status Script](http://hostingfu.com/article/quick-nginx-status-script)
* [zabbixでnginxの接続状態を確認する - 雑記](http://og732.hatenadiary.com/entry/2013/05/22/212107)

リクエスト制限関連

* [nginxのHttpLimitReqModuleを試してみる -  KAYAC engineers' blog](http://tech.kayac.com/archive/nginx-httplimitreqmodule.html)
* [nginx で帯域制限をかける(limit_rate を使ってみる) - レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/nginx-limit_rate.html)

* [Nginxで使える制限一覧 - しのぶら！](http://shinobra.com/2012/03/sawanoboly/nginx_limiter)

負荷テスト関連

* [http load](http://wiki.ducca.org/wiki/http_load)
* [nginx で帯域制限をかける(limit_rate を使ってみる) - レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/nginx-limit_rate.html)
* [Nginxで使える制限一覧 - しのぶら！](http://shinobra.com/2012/03/sawanoboly/nginx_limiter)