Nginx の純粋な構成でリアルタイム ログ レポートを実現するためのアイデアと方法

Nginx の純粋な構成でリアルタイム ログ レポートを実現するためのアイデアと方法

序文

Nginx は、よく使用される負荷分散ゲートウェイです。大量のログを生成します。ただし、Nginx 構成ファイルは宣言型プログラミング パラダイムであるため、プロセス制御を記述するのは便利ではなく、簡単な指示ではログ レポートを実現できません。

通常、Nginx ログ レポートでは、Nginx ログ ファイルを定期的に解析してレポートするためのシェル スクリプトまたは別の言語のスクリプトを作成する必要があります。

NJS モジュールを使用すると、リアルタイムのログ レポートを実現できます。

ただし、NJS モジュールでサポートされている命令の制限により、単一の命令ではログ レポートを適切に実装することはできません。複数の命令を組み合わせることで、ノンブロッキングのリアルタイム ログ レポートを実現できます。

このソリューションは Nginx で実装されており、Node、Python などの他のプロセスに依存しません。

実装のアイデア

Nginx には多くの指示があります。以下は最近検討された実装方法です。よりエレガントな実装方法がある場合は、コミュニケーションのためにメッセージを残してください。

JS スクリプトを作成するための強力な Njs モジュールがありますが、NJS モジュールの命令には多くの制限があり、Node のような機能を実現することはできません。

ログのリアルタイム レポートを実現するには、次の 2 つの機能を満たす必要があります。

  1. 各リクエストは
  2. 現在のリクエストの処理をブロックせずにバックグラウンドでレポートする

よく使用される js_set 命令はすべてのリクエストでトリガーできますが、同期操作のみをサポートします。フェッチ メソッドとサブリクエスト メソッドは使用できません。

fetch 関数は js_content ディレクティブで使用できます。ただし、location でのみ使用できます。したがって、他のディレクティブを使用してリクエストを js_content パスに転送し、ログ レポートをディレクティブ内で完了することができます。

http_auth_request_module モジュールの auth_request 命令は、jwt 検証などのリクエストの権限検証を実行するために使用されます。この命令はリクエストごとにトリガーされ、サブリクエストを作成し、リクエストの戻り結果に基づいて権限検証の結果を決定します。

したがって、これら 2 つのモジュールを組み合わせてログ レポートを実現できます。

実装手順

1. Nginxをコンパイルする

この機能を実装するには、Nginx が ngx_http_js_module モジュールと ngx_http_auth_request_module モジュールをサポートしている必要があります。これら 2 つのモジュールはデフォルトではインストールされません。自分でコンパイルして実装する必要があります。

  1. NJSモジュールのインストールについては、When JS Meets Nginxを参照してください。
  2. http_auth_request_moduleモジュールは、パラメータ--with-http_auth_request_moduleを追加することでコンパイルできます。

コンパイル

./configure --add-module=[NJS モジュール パス]/NJS/nginx --with-http_auth_request_module 

作成 && インストール 

2. 設定ファイルは以下のとおりです

http {
    js_import http.js; # js ファイルをインポート server {
        聞く 80;
    
        auth_request /proxy_report; # この命令は各リクエストの開始時にトリガーされ、proxy_report パスの場所に転送されるサブリクエストを作成します / { 
            インデックス index.html index.htm;
        }
        
        場所 /proxy_report {
            internal; #内部リクエストのみを制限します #元のリクエストの uri とメソッド データをヘッダーに保存します。auth_request リクエストによってこれらのデータが変更されるためです。            
            proxy_set_header X-オリジナルURI $request_uri;
            proxy_set_header X-Original-METHOD $request_method;
            # 別のサーバーに転送 proxy_pass http://localhost:8080/report;
        }
    }
    
    サーバー{
        8080を聴く;
        # レポートインターフェースは別のサーバーに配置されており、ループによるリクエストのトリガーを回避するためにサーバーに auth_request 命令はありません。location /report {
            #レポート操作を完了するために、js_content 命令を通じて js 処理スクリプトを導入します js_content http.report;
        }
    }
}
// http.js ファイルimport qs from "querystring";

非同期関数レポート(r){
    引数を{
        // ヘッダー uri から元の uri とメソッドを取得します: r.headersIn['X-Original-URI'],
        メソッド: r.headersIn['X-Original-METHOD'],
        リモートアドレス: r.remoteAddress、
        ステータス: r.status、
        ヘッダー入力: JSON.stringifry(r.headersIn)、
    }
    // 現在のリクエストプロセスをブロックせずに非同期リクエストを発行し、バックグラウンドでレポートを完了します ngx.fetch(`http://[レポートサービスパス]?${qs.stringify(args)}`, {
        メソッド: 'GET'、
    })
    // コマンドが成功したことを確認するためにステータスコード200を返します r.return(200)
}

エクスポートデフォルト{レポート}

要約する

Nginx の純粋な構成でリアルタイム ログ レポートを実装するアイデアと方法についてはこれで終わりです。Nginx ログのリアルタイム レポートに関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • nginx ログ設定手順の詳細な説明
  • Nginx でアクセスログをリアルタイムで表示できるようにする詳細な手順
  • Nginx ログ統計分析の一般的なコマンドの概要

<<:  MySQL データベースのパフォーマンス最適化の概要

>>:  CSS3 で作成された背景グラデーションアニメーション効果

推薦する

MySQL マスタースレーブの原理と構成の詳細

MySQLのマスタースレーブ構成と原理、参考までに具体的な内容は以下のとおりです。 1. 環境の選択...

簡単な手順で純粋な CSS3 で 3D 反転効果を実現

フロントエンド開発者の必須科目であるCSS3は、多くの基本的なアニメーション効果を実現するのに役立ち...

MySQL SQL ステートメント分析とクエリ最適化の詳細な説明

パフォーマンスの問題のあるSQL文を取得する方法1. ユーザーからのフィードバックを通じてパフォーマ...

CSS3 ベジェ曲線の例: リンクホバーアニメーション効果の作成

CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...

wavesurfer.js によるオーディオ波形描画の実装

1. レンダリングを見る進むを選択: 後方を選択: コードは次のとおりです(例): <テンプレ...

MySQL マスター/スレーブ データベース同期構成と一般的なエラー

アクセス回数が増えると、時間のかかるデータベース読み取り操作では、データベースへの負荷を軽減するため...

Linuxファイルの基本属性の知識ポイントのまとめ

Linux システムは典型的なマルチユーザー システムです。異なるユーザーは異なる立場にあり、異なる...

Dockerfile を使用したカスタムイメージの構築の実装

目次序文Dockerfile の紹介Dockerfileはイメージプロセスを構築するDockerfi...

Linux の cut コマンドの説明

Linux や Unix の cut コマンドは、ファイルの各行から一部を切り取って標準出力に出力す...

MySQL最適化ツール(推奨)

序文今日 GitHub を閲覧していたところ、SQL を最適化および書き換えるための sora とい...

jsを使用して写真をアップロードする機能を実現する

フロントエンドで画像をアップロードする原理は、入力 type="file" タグ...

JS ベースのページフローティングボックスを実装するためのサンプルコード

スクロール バーを下に引くと、主にposition:fixed;スタイルにより、フローティング ボッ...

nginx でネストされた if メソッドを実装する方法

Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...