nginxのアクセスログ解析にalpとngxtop

ISUCON用にnginxのアクセスログ解析して各ページごとの応答速度やサイズ、ステータスコード等いくつかの観点から集計ができる簡単に使えそうなツールとしてalpとngxtopがよさそうなのでインストール方法と簡単な使い方をまとめた。

環境: CentOS7

# alp

https://github.com/tkuchiki/alp

## alp導入(CentOS7)

- alpコマンドインストール

```
# curl -L -O https://github.com/tkuchiki/alp/releases/download/v0.3.1/alp_linux_amd64.zip
# yum install -y unzip
# unzip alp_linux_amd64.zip
# mv alp /usr/bin/alp
```

- nginx log formatの指定

```
http{

    ~~~

    ##  /etc/nginx/nginx.confのlog_formatとaccess_logの行を以下のように変更
    ##  

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #
    #access_log  /var/log/nginx/access.log  main;

    log_format ltsv "time:$time_local"
                "\thost:$remote_addr"
                "\tforwardedfor:$http_x_forwarded_for"
                "\treq:$request"
                "\tstatus:$status"
                "\tmethod:$request_method"
                "\turi:$request_uri"
                "\tsize:$body_bytes_sent"
                "\treferer:$http_referer"
                "\tua:$http_user_agent"
                "\treqtime:$request_time"
                "\tcache:$upstream_http_x_cache"
                "\truntime:$upstream_http_x_runtime"
                "\tapptime:$upstream_response_time"
                "\tvhost:$host";

    access_log  /var/log/nginx/access.log  ltsv;

```

一度ログを空にしてから設定変更反映

```
# echo -n "" > /var/log/nginx/access.log
# systemctl restart nginx
```

## 使い方


```
## 出力はpathごとの統計情報
## COUNT: アクセス回数
## MIN、MAX、SUM、AVG: 
# alp -f /var/log/nginx/access.log

+-------+-------+-------+-------+-------+-------+-------+-------+--------+-----------+-----------+-----------+--
---------+--------+-----+
| COUNT |  MIN  |  MAX  |  SUM  |  AVG  |  P1   |  P50  |  P99  | STDDEV | MIN(BODY) | MAX(BODY) | SUM(BODY) | A
VG(BODY) | METHOD | URI |
+-------+-------+-------+-------+-------+-------+-------+-------+--------+-----------+-----------+-----------+--
---------+--------+-----+
|     1 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 |  0.000 |   612.000 |   612.000 |   612.000 |  
 612.000 | GET    | /   |
+-------+-------+-------+-------+-------+-------+-------+-------+--------+-----------+-----------+-----------+--
---------+--------+-----+



## アクセス回数順にソート(-rで降順)
#alp -f /var/log/nginx/access.log --cnt -r

```

# ngxtop

https://github.com/lebinh/ngxtop

## インストール

```
# yum install -y epel-release
# yum install -y python-pip
# pip install ngxtop
```

ngxtopはnginx.confのlog_formatを見てよしなにログをパースしてくれるみたいなので
alpのlog_formatをそのまま使っている。

## 使い方

```
## topコマンドのように以下のコマンド入力後のnginxのアクセスを解析して
# 以下のようにpathごとに内容を表示する
# nginxtop

running for 380 seconds, 56 records processed: 0.15 req/sec

Summary:
|   count |   avg_bytes_sent |   2xx |   3xx |   4xx |   5xx |
|---------+------------------+-------+-------+-------+-------|
|      56 |          393.321 |     8 |    18 |    30 |     0 |

Detailed:
| request_path   |   count |   avg_bytes_sent |   2xx |   3xx |   4xx |   5xx |
|----------------+---------+------------------+-------+-------+-------+-------|
| /              |      26 |          188.308 |     8 |    18 |     0 |     0 |
| /test          |      22 |          571.000 |     0 |     0 |    22 |     0 |
| /favicon.ico   |       8 |          571.000 |     0 |     0 |     8 |     0 |


## ログファイルを解析して出力する場合
# ngxtop --no-follow

## 出力されるpathの上限を変更する(デフォルト 10)

# ngxtop -n 100 --no-follow
```