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 で作成された背景グラデーションアニメーション効果

推薦する

LinuxサーバーにVueプロジェクトをデプロイする

ケース1 vue-cliはvue3プロジェクトをビルドし、プロジェクトをLinuxサーバーにアップロ...

MySQLのGROUP BYステートメントを最適化する方法

MySQL で、id、a、b の 3 つのフィールドを持つ新しいテーブルを作成します。次のように、同...

MySQL でレプリケーション フィルターを動的に変更する方法

MySQLはレプリケーションフィルターを動的に変更します今日遭遇した問題についてお話しします。今日は...

私の CSS フレームワーク - base.css (ブラウザのデフォルト スタイルをリセット)

コードをコピーコードは次のとおりです。 @文字セット "utf-8"; /* @...

Vue 仮想 Dom から実際の Dom への変換

別のツリー構造があるJavascriptオブジェクトでは、このツリーが本物であると伝えるだけでよいD...

docker createコマンドの使用方法

docker create コマンドは、イメージに基づいてコンテナを作成できます。このコマンドの効果...

SSH経由でローカルLinux仮想マシンに接続するプロセスを記録する

実験環境:物理マシン Windows 10 x64物理NIC情報IPv4 アドレス: 192.168...

Zabbixを使用してOracleテーブルスペースの操作プロセスを監視する

0. 概要Zabbix は非常に強力なオープンソースの監視ツールです。以下では、Zabbix がテー...

Docker で Ubuntu に Python3 と Pip をインストールする際の問題

文章1) Ubuntuイメージをダウンロードする docker プル Ubuntu 2) 画像を見る...

MySQLは実際に分散ロックを実装できる

序文前回の記事では、eコマース シナリオでのフラッシュ セールの例を通じて、モノリシック アーキテク...

画像比較を実現するjQueryプラグイン

この記事の例では、画像比較を実現するためのjQueryプラグインの具体的なコードを参考までに共有して...

インタラクションデザインと心理学の驚くべきつながり18選

デザイナーは心理学を理解する必要があるデザイナーが知るべき心理学という本は非常に興味深いです。まず、...

要素 DateTimePicker+vue ポップアップボックスに時間のみが表示される問題を解決する

3つの知識ポイント: 1. CSS子孫セレクターhttps://www.w3school.com.c...

EF (Entity Framework) の挿入または更新データ エラーの解決方法

エラー メッセージ:ストアの更新、挿入、または削除ステートメントが予期しない行数 (0) に影響を与...

MySQLデータベースは何をするのか

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...