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 アクセスログを分析するには、サードパーティ製ソフトウェア のNGINX ACCESSLOG > サードパーティーソフトウェアを選択します。

3.データソースを設定

  1. ご利用環境に合わせて設定名とログパスを入力します。また、NGINX ログフォーマット欄に、推奨の上記log_formatを入力します。
    図 3. データソースの設定


    Log Service は該当するキーを自動的に展開します。

    $requestは、request_methodrequest_uriの 2 つのキーに展開されます。
    図 4. Nginx キー


  2. マシングループに適用します。

    マシングループをまだ作成していなければ、まずマシングループを作成します。 マシングループの作成方法については、「マシングループの作成と識別子に IP アドレスを指定」をご参照ください。

    Logtail の設定が有効になるまで、最大で 3 分ほどかかります。

4.検索、分析、視覚化

Logtail 設定を適用するマシングループのハートビートが正常ステータスであることを確認し、右側のプレビューをクリックして収集データを取得します。

図 5. プレビュー


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

図 6. キー/値のインデックス属性


次へをクリックします。Log Service はインデックス属性は自動的に設定し、分析に利用できるようnginx-dashboardダッシュボードが生成されます。

5.アクセスログを分析する

インデックス機能を有効にすると、デフォルトでダッシュボードの生成されるページに、各指標の分析が表示されます。 ダッシュボードの使い方については、「ダッシュボード」をご参照ください。

図 7. ダッシュボード


  • 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 サイトのアクセス状況を具体的に把握することができます。