Nginx サーバーで Web サイトを構築する Web 管理者は数多くいます。Nginx アクセスログを統計分析し、Web サイトのページビューやアクセス時間といったデータを取得して Web サイトのトラフィックデータを解析します。CNZZ (中国のアクセス解析ツール) といった従来の方法では、Web サイトに js を挿入しておき、ユーザーがサイトにアクセスすると js を起動させています。しかし、この方法ではアクセスリクエストしか記録されません。 ストリーム処理やオフライン統計分析で Nginx アクセスログを分析することもできますが、環境構築に手間がかかり、適時に柔軟な分析を行うことが難しくなります。
Log Service ではログのリアルタイム照会、分析することができます。また、分析結果がダッシュボードに表示されるため、Nginx のアクセスログの複雑な解析を大幅に軽減することができ、簡単に Web サイトアクセスデータの統計を出すことができます。 本ドキュメントでは、Nginx のアクセスログを分析して、ログ分析の詳細な手順をご紹介します。
利用イメージ
Nginx をサーバーで、個人の Web サイト構築し、サイトのアクセス状況を把握するために Nginx のアクセスログを分析し、PV 数、UV 数、アクセスの多い Web ページ、使用率の高いリクエストメソッド、不正リクエスト、クライアント情報、および Web サイトのリファラー一覧を取得するものとします。
ログフォーマット
分析シナリオに適当な、次のlog_format
を使用されることを推奨します。
log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host '
'$status $request_length $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time $upstream_response_time';
各フィールドの説明は次のとおりです。
フィールド | 意味 |
---|---|
remote_addr | クライアントアドレス |
remote_user | クライアントユーザー名 |
time_local | サーバー時間 |
request | メソッド名、アドレス、および HTTP プロトコルを含むリクエストコンテンツ |
http_host | ユーザーリクエストで使用される HTTP アドレス |
Status | 応答 HTTP ステータスコード |
request_length | リクエストサイズ |
body_bytes_sent | 応答の Byte 数 |
http_referer | リファラー (参照元) |
http_user_agent | クライアント名 |
Request_time | リクエスト処理待ちの総時間 |
upstream_response_time | アップストリームサービス処理待ち時間 |
手順
1.データインポートウィザードを開く
Log Service のデータインポートウィザードにより、データソースに迅速にアクセスできます。次のいずれかの方法でデータインポートウィザードを起動し、Log Service で Nginx のアクセスログを収集します。
- プロジェクトの作成
Logstore を作成したら、既存のプロジェクトまたは新たに作成したプロジェクトのデータインポートウィザードをクリックします。
図 1. データインポートウィザード - 既存の Logstore であれば、Logstore リストページより該当 Logstore のデータインポートウィザードアイコンをクリックします。
図 2. Logstore リスト
2.データソースを選択
Log Service には、クラウドサービス、サードパーティーのソフトウェア、API、SDK といった、さまざまな種類のデータソースを扱うことができます。Nginx アクセスログを分析するには、サードパーティ製ソフトウェア の
を選択します。3.データソースを設定
- ご利用環境に合わせて設定名とログパスを入力します。また、NGINX ログフォーマット欄に、推奨の上記
log_format
を入力します。図 3. データソースの設定 Log Service は該当するキーを自動的に展開します。
注$request
は、request_method
とrequest_uri
の 2 つのキーに展開されます。図 4. Nginx キー - マシングループに適用します。
マシングループをまだ作成していなければ、まずマシングループを作成します。 マシングループの作成方法については、「マシングループの作成と識別子に IP アドレスを指定」をご参照ください。
注 Logtail の設定が有効になるまで、最大で 3 分ほどかかります。
4.検索、分析、視覚化
Logtail 設定を適用するマシングループのハートビートが正常ステータスであることを確認し、右側のプレビューをクリックして収集データを取得します。

Log Service は、分析と使用のために事前定義されたキーを提供します。 実際のキー(プレビューされたデータに従って生成) を選択して、デフォルトのキーとマッピングすることができます。

次へをクリックします。Log Service はインデックス属性は自動的に設定し、分析に利用できるようnginx-dashboard
ダッシュボードが生成されます。
5.アクセスログを分析する
インデックス機能を有効にすると、デフォルトでダッシュボードの生成されるページに、各指標の分析が表示されます。 ダッシュボードの使い方については、「ダッシュボード」をご参照ください。

- PV/UV 統計 (pv_uv)
前日の PV 数および UV 数を集計します。
図 8. PV/UV統計 統計ステートメント
* | select approx_distinct(remote_addr) as uv , count(1) as pv , date_format(date_trunc('hour', __time__), '%m-%d %H:%i') as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i') order by time limit 1000
- アクセス数の多いページトップ 10 (top_page)
前日の、PV 数の最も多かった上位 10 ページを集計します。
図 9. アクセス数統計 統計ステートメント
* | select split_part(request_uri,'?',1) as path, count(1) as pv group by split_part(request_uri,'?',1) order by pv desc limit 10
- リクエストメソッドの割合を集計 (http_method_percentage)
前日に使用されたリクエストメソッドの割合を集計します。
図 10. リクエストメソッドの割合 統計ステートメント
* | select count(1) as pv, request_method group by request_method
- リクエストステータスの割合を集計 (http_status_percentage)
前日の各リクエストステータス(HTTPステータスコード) の割合を集計します。
図 11. リクエストステータスの割合 統計ステートメント
* | select count(1) as pv, status group by status
- リクエスト UA の割合を集計 (user_agent)
前日にアクセスに使用されたブラウザの割合を集計します。
図 12. リクエスト UA の割合 統計ステートメント
* | select count(1) as pv, case when http_user_agent like '%Chrome%' then 'Chrome' when http_user_agent like '%Firefox%' then 'Firefox' when http_user_agent like '%Safari%' then 'Safari' else 'unKnown' end as http_user_agent group by http_user_agent order by pv desc limit 10
- リファラートップ 10 を集計 (top_10_referer)
前日の上位 10 リファラー (参照元) を集計します。
図 13. リファラートップ 10 集計 統計ステートメント
* | select count(1) as pv, http_referer group by http_referer order by pv desc limit 10
6.アクセス解析と最適化
Web 管理者は、予め用意されているアクセス指標の他、リクエスト処理の待ち時間や、待ち時間の多いページを把握するために、アクセリクエストを分析することもあります。 そういった場合に、クエリページに入力すると迅速にアクセス解析できます。
- 平均レイテンシと最大レイテンシを集計
平均レイテンシと最大レイテンシを 5 分ごとに設定して、レイテンシの課題を把握します。
統計ステートメント
* | select from_unixtime(__time__ -__time__% 300) as time, avg(request_time) as avg_latency , max(request_time) as max_latency group by __time__ -__time__% 300
- 最大レイテンシでリクエストページを集計
最大レイテンシを把握できたら、最大レイテンシが発生しているリクエストページを特定してページレスポンスを最適化します。
統計ステートメント
* | select from_unixtime(__time__ - __time__% 60) , max_by(request_uri,request_time) group by __time__ - __time__%60
- リクエストレイテンシの分布を集計
Web サイト全体のリクエストレイテンシ分布を集計します。 レイテンシを 10 個のバケットに配置し、各レイテンシの間隔でリクエストの数を確認します。
統計ステートメント
* |select numeric_histogram(10,request_time)
- レイテンシトップ 10 を集計
最大レイテンシだけでなく、2 番目以降 10 番目まで、またその値を集計します。
統計ステートメント
* | select max(request_time,10)
- 最大レイテンシの発生しているページを最適化
/url2
ページで最大レイテンシが発生しているとします。/url2
ページを最適化するには、/url2
ページのPV、UV、メソッド、ステータス、ブラウザの数や平均レイテンシ、最大レイテンシを集計します。統計ステートメント
request_uri:"/url2" | select count(1) as pv, approx_distinct(remote_addr) as uv, histogram(method) as method_pv, histogram(status) as status_pv, histogram(user_agent) as user_agent_pv, avg(request_time) as avg_latency, max(request_time) as max_latency
上記のデータを取得することにより、有用な Web サイトのアクセス状況を具体的に把握することができます。