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 8.0.22 の最新バージョンのダウンロードとインストールの超詳細なチュートリアル (Windows 64 ビット)

目次序文1. 公式サイトからMySQL 8.0.22をダウンロードする2. 環境変数を設定する3. ...

Dockerで新しいイメージを手動で構築する方法

この記事では、Docker で新しいイメージを手動で構築する方法を紹介し、皆さんと共有します。詳細は...

NavicatでMySqlスケジュールタスクを作成する方法の詳細な説明

Navicat で MySql スケジュールタスクを作成する詳細な説明イベントは、MySQL が特定...

HTML減量 HTMLタグを合理化してWebページを作成する

HTML4 についてHTML (XHTML ではありません)、MIME タイプは text/html...

現在使用されている設定ファイル my.cnf を表示する mysql メソッド (推奨)

my.cnfは、MySQL の起動時に読み込まれる設定ファイルです。通常は MySQL インストー...

カルーセル効果を書くためのjs

この記事では、カルーセルマップの効果を実現するためのjsの具体的なコードを参考までに共有します。具体...

デザイン理論: なぜ私たちは間違った場所を見ているのでしょうか?

数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...

アイデアを war パッケージにパッケージ化し、tomcat にデプロイしてアクセス パスの問題 (図とテキスト)

Web プロジェクトを war にパッケージ化するアイデアにとって最も重要なことは、アトリフィカを...

docker インストール後に hello-world を実行する問題を解決する

yumを使用してcentos7.3にDocker V1.13.1をインストールしましたしかし、doc...

Portainer を使用して複数の Docker コンテナ環境を管理する方法を説明します。

目次Portainerは複数のDockerコンテナ環境を管理します2. Dockerを管理する2.1...

mysql8.0.18 で winx64 をインストールするための詳細なチュートリアル (画像とテキスト付き)

MySQLデータベースをダウンロードするには、https://dev.mysql.com/down...

Web開発でボックスを中央に配置するいくつかの方法

1. ボックスを中央に配置するいくつかの方法を記録します。 1.0、マージン幅固定、高さ中央配置。 ...

Vue+canvas は、ウォーターフォール チャートを上から下までリアルタイムに更新する効果を実現します (QT と同様)

早速ですが、デモ画像をご紹介します。実装されている機能は、左側に凡例、右側にウォーターフォール チャ...

数百万のデータに対して MySQL クエリを最適化する 4 つの方法

目次1. 時間が経つにつれて限界が遅くなる理由2. 百万データシミュレーション1. 従業員テーブルと...

Linuxにログインする際の文字セットの問題を解決する方法

文字セットエラーは常に存在するロケール: LC_CTYPE をデフォルト ロケールに設定できません:...