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 はまだ必要ですか?

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

推薦する

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...

読み取り専用と無効の微妙な違いの詳細な説明

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにします...

サーバー同時実行数の推定式と計算方法

最近、サーバーのストレステストを再度行う必要が出てきました。ここでは、最近学んだ見積もりスキームと見...

Clickhouse Docker クラスターの展開と構成を例を使って説明します

目次前面に書かれた環境の展開Zookeeper クラスタの展開Clickhouse クラスターの展開...

Reactの基本のまとめ

目次序文始めるReactライフサイクルリアクトファイバーリアクトセットステートReactイベントメカ...

MySQLでテーブルインデックスを構築する方法

目次複数の種類のフィルタリングをサポート複数の範囲のクエリを避ける並べ替えを最適化するインデックスの...

Vue プロジェクト @change 複数のパラメータを使用して複数のイベントを渡す

まず、変更イベントは 1 つだけです。 changelevel() //値を選択選択を変更して行の値...

複数の Tomcat を展開して起動し、プロジェクトを移行する方法を 1 つの記事で学習します。

目次tomcatをデプロイする1.ダウンロードして解凍する2. 設定ファイルを変更する移植プロジェク...

重複したMySQLテーブルをマージして削除する簡単な方法

シナリオ:クロールされたデータは、別のメインテーブルと同じ構造を持つデータテーブルを生成するため、マ...

mysqlタイムスタンプの使用

序文:タイムスタンプ フィールドは、MySQL でよく使用されます。たとえば、データ行が作成または変...

モバイルレイアウトにvw+remを使用する方法

まだ rem フレキシブルレイアウトを使用していますか?圧縮された js コードの大きなセクションを...

Vueは水平の斜めの棒グラフを実装します

この記事では、水平傾斜棒グラフを実装するためのVueの具体的なコードを参考までに共有します。具体的な...

nginxフォワードプロキシとリバースプロキシの詳細な説明

目次フォワードプロキシnginx リバースプロキシnginx リバースプロキシ 02リバースプロキシ...

WeChatアプレットでSVGアイコンを使用する方法

SVG は、さまざまな利点があるため、近年広く使用されています。残念ながら、WeChat ミニプログ...

CSSを使用してダークモードとブライトモードを切り替える

Web Skills第5号では、CSSでダークモードやハイライトモードを実装するための技術的なソリュ...