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とOracleの違いのまとめ(機能性能の比較、選択、使用時のSQLなど)

1. 同時実行性同時実行性は OLTP データベースの最も重要な機能ですが、同時実行性にはリソース...

Packetdrillの簡潔なユーザーガイド

1. Packetdrillのコンパイルとインストールソースコードリンク https://githu...

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明MySQL データベースを使用して、...

Node.js は、異なるリクエストパスに応じて異なるデータを返します。

目次1. 異なるリクエストパスに応じて異なるデータを返す方法を学びます。 2. 送信データ: データ...

CSSで記事の区切り線のスタイルを実装するさまざまな方法のまとめ

この記事では、CSS で記事の区切り線を実装するさまざまな方法をまとめています。区切り線はページを美...

Linux で PyCurl のエラーを解決する方法

「curl-config を実行できませんでした」の解決策 pycurl のダウンロード/解凍 (p...

HTMLフォームのいくつかの送信方法の概要

最も一般的で、最もよく使用され、最も一般的な方法は、submit タイプを使用することです。コードを...

preタグを自動的に折り返すためのサンプルコード

pre 要素は、フォーマット済みのテキストを定義します。 pre 要素で囲まれたテキストでは、通常、...

Dockerコンテナのインポ​​ートとエクスポートに関するチュートリアル

背景Docker の人気は、コンテナの共有と移植が容易であることと密接に関係しています。ユーザーは、...

MySQL 8.0.11 圧縮版のインストールチュートリアル

この記事では、MySQL 8.0.11のインストールチュートリアルを参考までに紹介します。具体的な内...

MySQLインスタンスが起動できない問題の分析と解決

目次序文シナリオ分析要約する序文数日前、友人がWeChatで私に連絡してきて、マシンがダウンタイムか...

CSS変数を使用してスタイルを変更する方法の例

質問js を使用して CSS 疑似クラス スタイルを変更するにはどうすればよいでしょうか?しかし、j...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

一定時間後にNavicatがデータベースから自動的に切断される問題の解決方法

これは、データベース サーバーが、接続が多すぎるのを避けるために、一定時間非アクティブな状態が続くと...

Linux スワップメモリ​​を拡張する方法

スワップ メモリとは、主に物理メモリが不足している場合に、システムがハード ディスク領域の一部をサー...