nginx でのリクエストのカウント追跡の簡単な分析

nginx でのリクエストのカウント追跡の簡単な分析

まずは適用方法を説明します。nginxモジュールにはjtxyとjtcmdの2つがあります。 http リクエストが来ると、処理のために jtxy モジュールに入ります。jtxy はサブリクエストを作成し、それを jtcmd に送信します。jtcmd は、処理のために上流の非 http サービス A への上流フローを作成します。A が処理を完了して結果を取得すると、その結果が jtcmd サブリクエストに返されます。jtcmd サブリクエストは結果を jtxy に返します。これがプロセスです。リクエストの数を追跡してみましょう。

1. リクエストが到着し、リクエストが作成され、ngx_http_alloc_requestのcountが1に初期化されます。

この時点でカウントは1です。

 r->main = r;
    r->カウント = 1;

2. jtxy モジュールでリクエストを処理するときに、ngx_http_subrequest が呼び出されてサブリクエストが作成され、ngx_http_subrequest でカウントが 1 増加します。

この時点でカウントは2

 r->main->count++;

3. モジュール (ここでは jtxy モジュール) を離れるときに、ngx_http_finalize_request が呼び出され、ngx_http_finalize_request のカウントが 1 つ減ります。

この時点でカウントは1です。

 r->content_handlerの場合{
        r->write_event_handler = ngx_http_request_empty_handler;
        ngx_http_finalize_request(r, r->content_handler(r));
        NGX_OK を返します。
    }

4. 次に、サブリクエストの jtcmd モジュールに入ります。このモジュールでは、サブリクエスト ((r!=r->main)) であることがわかった場合、メインリクエスト数を 1 つ増やす必要があります。このポイントは赤で強調表示されています。1 が追加されないと、メインのリクエスト数に問題が発生するためです。この問題は、後でカウントから 1 を引いた値を追跡し続けると見つかります。

以下は、jtxy によって開始された jtcmd サブリクエストです。ここでの r と r->main は同じではありません。r は jtcmd であり、r->main は jtxy です。

この時点でカウントは2です。

同時に、サブリクエストの jtcmd モジュールではアップストリームが使用されるため、count を 1 増やす必要がありますが、ngx_http_read_client_request_body(r, ngx_http_upstream_init) を使用すると、ngx_http_read_client_request_body はすでに 1 増加しているため、ここで 1 増やす必要はありません。

この時点でカウントは3です。

「nginx の詳細な理解」のセクション 5.1.5 を参照してください。上流フローに 1 を追加する必要がある理由の説明があります。

したがって、ここでのカウントは 2 回追加されます。

 r->upstream->resolved->sockaddr = (struct sockaddr*)&backendSockAddr;
    r->upstream->resolved->socklen = sizeof(struct sockaddr_in);
    r->アップストリーム->解決済み->naddrs = 1;
 
    r->upstream->create_request = jtcmd_upstream_create_request;
    r->upstream->process_header = jtcmd_upstream_process_header;
    r->upstream->finalize_request = jtcmd_upstream_finalize_request;
    r->upstream->abort_request = jtcmd_upstream_abort_request;
 
    r->upstream->input_filter_init = ngx_http_jtcmd_filter_init;
    r->upstream->input_filter = ngx_http_jtcmd_filter;
    r->アップストリーム->input_filter_ctx = jtcmdctx;
    
    //r->subrequest_in_memory = 1;
    
    r!=r->mainの場合 
    {
        r->main->count++;
    }
 
    ngx_int_t rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);
    rc == NGX_ERROR || rc > NGX_OK の場合 {
        rc を返します。
    }

ここで、r はサブリクエストであり、r->main はメインリクエストです。また、サブリクエスト数は常に 0 であることに注意してください。

 ngx_int_t
ngx_http_read_client_request_body(ngx_http_request_t *r,
    ngx_http_client_body_handler_pt post_handler)
{
    size_t を事前読み取りします。
    ssize_t サイズ;
    ngx_int_t rc;
    ngx_buf_t *b;
    ngx_chain_t 出力;
    ngx_http_request_body_t *rb;
    ngx_http_core_loc_conf_t *clcf;
 
    r->main->count++;

5. ステップ 3 と同様に、リクエストが処理された後、ngx_http_finalize_request が呼び出され、カウントが 1 減ります。ただし、ここでの違いは、これがサブリクエストであり、ステップ r = r->main があるため、実際の削減はメイン リクエストに対して行われることです。これは、ステップ 4 で赤で説明したように 1 を追加した理由でもあります。

この時点でカウントは2

静的ボイド
ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)
{
    ngx_connection_t *c;
 
    r = r->メイン;
    c = r->接続;
 
    ngx_log_debug2(NGX_LOG_DEBUG_HTTP、c->log、0、
                   "http リクエスト数:%d ブロック:%d", r->count, r->blocked);
 
    r->count == 0 の場合
        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http リクエスト数がゼロです");
    }
 
    r->カウント--;

6. その後、サブリクエストはアップストリームを使用するため、このためカウントが 1 増加し、アップストリームが終了すると 1 減少します。

この時点でカウントは1です。

7. 子リクエストが完了した後、親リクエストのコールバックメソッドは処理を継続し、メインリクエストモジュール jtxy に戻ります。ここで、処理が完了した後、ngx_http_finalize_request が呼び出され、リクエストが終了します。このとき、count は 1 となり、リクエストが解放されます。

空所
ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc)
{
    ngx_log_t *ログ;
    ngx_pool_t *プール;
    構造体 linger linger;
    ngx_http_cleanup_t *cln;
    ngx_http_log_ctx_t *ctx;
    ngx_http_core_loc_conf_t *clcf;
 
    ログ = r->接続->ログ;
 
    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ログ, 0, "http クローズ要求");
 
    r->pool == NULLの場合{
        ngx_log_error(NGX_LOG_ALERT, log, 0, "http リクエストはすでに閉じられています");
        戻る;
    }

要約する

nginx のリクエスト数追跡に関するこの記事はこれで終わりです。nginx のリクエスト数追跡に関する詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  フロントエンド制作に関する簡単な議論: 互換性のために IE6 はまだ必要ですか?

>>:  ノードスクリプトで自動サインインと抽選機能を実現

推薦する

MySQL で単一のフィールド内の複数の値を分割および結合する方法

複数の値を組み合わせて表示これで、図1から図2に示す要件が揃いました。 どうやってやるんですか?次の...

docker run後、ステータスは常にExitedになります

追加するdocker run -it -name test -d nginx:latest /bin...

JavaScript と CSS を最適化してウェブサイトのパフォーマンスを向上させる

<br /> 第 1 部と第 2 部では、Web サイトのパフォーマンス、ページ コンテ...

Linux カーネル デバイス ドライバー仮想ファイル システムに関する注意事項

/******************** * 仮想ファイルシステム VFS **********...

Dockerコンテナを終了した後も実行を継続する方法

現象:イメージを実行します (例: ubuntu14.04)。 docker run -it --r...

Vue で lodop 印刷コントロールを使用してブラウザ互換の印刷を実現する方法

序文このコントロールを直接印刷すると下部に透かしが入りますが、公式 Web サイトから購入することで...

スクロールバーを非表示にしてコンテンツをスクロールする CSS サンプルコード

序文ページの HTML 構造にネストされたボックスが多数含まれている場合、ページに複数の垂直スクロー...

正の整数かどうかを判断するMYSQLカスタム関数の例コード

関数を記述できます。主に正規表現を使用して判断を行います。入力文字が空の場合は、「-」を使用して置き...

MySQLデータベースを別のマシンに移行する方法の詳細な説明

1. まず、移行サーバー上のデータ ファイルを見つけます。MySQL 5.7 とデフォルトのインスト...

HTMLでは、全体的なスタイルとレイアウトを崩さずに、部分的に強制スクロールバーを使用できます。

まずはエフェクト画像を投稿します:全体的なスタイルとレイアウトが崩れないように、スクロール バーがロ...

mysql 8.0.18 mgr のインストールと切り替え機能

1. システムインストールパッケージ yum -y インストール make gcc-c++ cmak...

MySQL での正規表現置換のための replace と regexp の使用法の分析

この記事では、例を使用して、replace と regexp を使用して MySQL で正規表現を置...

HTMLでマスクレイヤーを実装する方法 HTMLでマスクレイヤーを使用する方法

Web ページでマスク レイヤーを使用すると、繰り返しの操作を防ぎ、読み込みを促進できます。また、ポ...

ブラウザでTIF形式の画像を表示する方法

ブラウザはTIF形式の画像を表示しますコードをコピーコードは次のとおりです。 <html>...

ファイルのダウンロードを実現する javascript Blob オブジェクト

目次例示する1. ブロブオブジェクト2. フロントエンド3. バックエンド要約する例示する最近、ファ...