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

推薦する

HTML の類似タグと属性の違いの詳細な説明

【1】<i></i>タグと<em></em>タグ同じ...

Spring Boot 階層化パッケージング Docker イメージの実践と分析 (推奨)

目次1. Springbootプロジェクトを準備する2. 関連する設定を実行する3.パッケージ4.D...

VueプロジェクトにPWAを導入する手順

目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...

一時ファイルを作成できないために MySQL が起動できない問題を解決する方法

問題の説明最近、仕事中に問題が発生しました。MySQL が起動に失敗しました。エラー ログは次のとお...

Vue でフルスクリーンを実装し、フルスクリーン終了を監視する

目次序文:実装手順:完全なソースコード:詳細情報:序文: vueでは、デフォルトページを実装し、di...

Web 標準アプリケーション: Tencent QQ ホームページの再設計

Tencent QQのホームページがリニューアルされ、Webフロントエンド開発がますます注目を集めて...

Centos7 に yum 経由で MySQL をインストールする方法

1. MySQLがインストールされているかどうかを確認する yum インストール済みリスト | gr...

Centos8 (最小インストール) Python3.8+pip のインストール方法に関するチュートリアル

Python8のインストールを最小化した後、Python3.8.1をインストールしました。オンライン...

MySQL でよく使用される SQL 文を表示する (詳細な説明)

#mysql -uroot -pパスワードを入力してくださいmysql> show full...

mysql init_connect に関するいくつかの重要なポイントの要約

init_connectの役割init_connect は通常、接続が来たときに、自動コミットを 0...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.17のインストールと設定方法を参考までに紹介します。具体的な内容は...

MySQLスローログに関する知識のまとめ

目次1. スローログの紹介2. スローログの練習1. スローログの紹介スロー ログの正式名称はスロー...

Reactの新バージョンのライフサイクルフック機能と使用方法の詳細な説明

旧ライフサイクルと比較して 3つのフックが廃止され、2つの新しいフックが追加されましたReact16...

Vue3 でモバイル ログインおよび登録モジュールをエレガントに実装する方法

目次序文入力ボックスコンポーネントレイアウトvモデルデータ検証ルール設計形状サブコンポーネントは検証...

ZabbixはSNMPに基づいてLinuxホストを監視します

序文: Linux ホストは、エージェント プログラムをインストールする場合でも、SNMP を使用す...