まずは適用方法を説明します。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 はまだ必要ですか?
1. 同時実行性同時実行性は OLTP データベースの最も重要な機能ですが、同時実行性にはリソース...
1. Packetdrillのコンパイルとインストールソースコードリンク https://githu...
JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明MySQL データベースを使用して、...
目次1. 異なるリクエストパスに応じて異なるデータを返す方法を学びます。 2. 送信データ: データ...
この記事では、CSS で記事の区切り線を実装するさまざまな方法をまとめています。区切り線はページを美...
「curl-config を実行できませんでした」の解決策 pycurl のダウンロード/解凍 (p...
最も一般的で、最もよく使用され、最も一般的な方法は、submit タイプを使用することです。コードを...
pre 要素は、フォーマット済みのテキストを定義します。 pre 要素で囲まれたテキストでは、通常、...
背景Docker の人気は、コンテナの共有と移植が容易であることと密接に関係しています。ユーザーは、...
この記事では、MySQL 8.0.11のインストールチュートリアルを参考までに紹介します。具体的な内...
目次序文シナリオ分析要約する序文数日前、友人がWeChatで私に連絡してきて、マシンがダウンタイムか...
質問js を使用して CSS 疑似クラス スタイルを変更するにはどうすればよいでしょうか?しかし、j...
初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...
これは、データベース サーバーが、接続が多すぎるのを避けるために、一定時間非アクティブな状態が続くと...
スワップ メモリとは、主に物理メモリが不足している場合に、システムがハード ディスク領域の一部をサー...