Lassen Sie mich zunächst die Anwendungsmethode erklären. Es gibt zwei Nginx-Module, eines heißt jtxy und das andere heißt jtcmd. Wenn eine HTTP-Anfrage eingeht, gelangt sie zur Verarbeitung in das Modul jtxy. jtxy erstellt eine Unteranfrage und sendet sie an jtcmd. jtcmd erstellt einen Upstream-Flow zu unserem Upstream-Nicht-HTTP-Dienst A zur Verarbeitung. Nachdem A die Verarbeitung abgeschlossen und das Ergebnis erhalten hat, gibt es das Ergebnis an die Unteranfrage jtcmd zurück. Die Unteranfrage jtcmd gibt das Ergebnis an jtxy zurück. So läuft der Vorgang ab. Lassen Sie uns die Anzahl der Anfragen verfolgen. 1. Eine Anfrage kommt an, eine Anfrage wird erstellt und die Anzahl in ngx_http_alloc_request wird auf 1 initialisiert Zu diesem Zeitpunkt beträgt der Zähler 1. r->Haupt = r; r->Anzahl = 1; 2. Bei der Verarbeitung der Anforderung im jtxy-Modul wird ngx_http_subrequest aufgerufen, um eine Unteranforderung zu erstellen, und die Anzahl in ngx_http_subrequest wird um 1 erhöht. Zurzeit beträgt die Anzahl 2 r->Haupt->Anzahl++; 3. Beim Verlassen eines Moduls (hier ist das jtxy-Modul) wird ngx_http_finalize_request aufgerufen und die Anzahl in ngx_http_finalize_request um eins reduziert. Zu diesem Zeitpunkt beträgt der Zähler 1. wenn (r->Inhaltshandler) { r->write_event_handler = ngx_http_request_empty_handler; ngx_http_finalize_request(r, r->content_handler(r)); gib NGX_OK zurück; } 4. Dann rufen wir unser Unteranforderungsmodul jtcmd auf. Wenn wir in diesem Modul feststellen, dass es sich um eine Unteranforderung handelt ((r!=r->main)), sollten wir die Anzahl der Hauptanforderungen um eins erhöhen. Dieser Punkt ist rot hervorgehoben, da, wenn 1 nicht hinzugefügt wird, ein Problem mit der Anzahl der Hauptanfragen vorliegt. Wir werden dieses Problem später finden, wenn wir die Anzahl minus 1 weiter verfolgen. Hier ist eine von jtxy initiierte jtcmd-Unteranforderung. r und r->main sind hier nicht dasselbe. r ist jtcmd und r->main ist jtxy. Zu diesem Zeitpunkt beträgt der Zähler 2. Gleichzeitig muss die Anzahl um 1 erhöht werden, da Upstream in unserem Subrequest-JTCM-Modul verwendet wird. Wenn wir jedoch ngx_http_read_client_request_body(r, ngx_http_upstream_init) verwenden, wurde ngx_http_read_client_request_body bereits um 1 erhöht, sodass wir diese Erhöhung um 1 hier nicht durchführen müssen. Zurzeit beträgt der Zähler 3. Sie können einen Blick auf Abschnitt 5.1.5 von „Umfassendes Verständnis von nginx“ werfen. Es gibt eine Erklärung für die Notwendigkeit, 1 zum Upstream-Flow hinzuzufügen. Die Zählung wird hier also zweimal addiert. r->upstream->aufgelöst->sockaddr = (Struktur sockaddr*)&backendSockAddr; r->upstream->gelöst->socklen = sizeof(Struktur sockaddr_in); r->Upstream->Aufgelöst->Naddrs = 1; r->upstream->Anforderung erstellen = jtcmd_upstream_Anforderung erstellen; r->upstream->Prozessheader = jtcmd_upstream_Prozessheader; 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->upstream->input_filter_ctx = jtcmdctx; //r->Unteranfrage_im_Speicher = 1; wenn(r!=r->main) { r->Haupt->Anzahl++; } ngx_int_t rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); wenn (rc == NGX_ERROR || rc > NGX_OK) { rc zurückgeben; } Hier ist r die Unteranfrage und r->main die Hauptanfrage. Beachten Sie auch, dass die Anzahl der Unteranfragen immer 0 ist. ngx_int_t ngx_http_read_client_request_body(ngx_http_request_t *r, ngx_http_client_body_handler_pt post_handler) { size_t vorlesen; ssize_t Größe; ngx_int_t rc; ngx_buf_t *b; ngx_chain_t aus; ngx_http_request_body_t *rb; ngx_http_core_loc_conf_t *clcf; r->Haupt->Anzahl++; 5. Wie in Schritt 3 wird nach der Verarbeitung der Anfrage ngx_http_finalize_request aufgerufen, um die Anzahl um eins zu reduzieren. Der Unterschied besteht hier jedoch darin, dass es sich um eine Unteranfrage handelt und es einen Schritt r = r->main gibt; die eigentliche Reduzierung erfolgt also auf die Hauptanfrage. Dies ist auch der Grund, warum wir 1 hinzugefügt haben, wie in Schritt 4 in Rot erklärt. Zurzeit beträgt die Anzahl 2 statische Leere ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc) { ngx_connection_t *c; r = r->Haupt; c = r->Verbindung; ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, „Anzahl der HTTP-Anfragen: %d, blk: %d“, r->Anzahl, r->blockiert); wenn (r->Anzahl == 0) { ngx_log_error(NGX_LOG_ALERT, c->log, 0, "Anzahl der HTTP-Anfragen ist null"); } r->Anzahl--; 6. Da die Unteranforderung dann Upstream verwendet, wird die Anzahl aus diesem Grund um 1 erhöht und am Ende des Upstreams um 1 reduziert. Zu diesem Zeitpunkt beträgt der Zähler 1. 7. Nachdem die untergeordnete Anforderung abgeschlossen ist, wird die Rückrufmethode der übergeordneten Anforderung weiter verarbeitet und dann zum Hauptanforderungsmodul jtxy zurückgekehrt. Hier wird nach Abschluss der Verarbeitung ngx_http_finalize_request aufgerufen, um die Anforderung zu beenden. Zu diesem Zeitpunkt beträgt der Zähler 1 und die Anforderung wird freigegeben. Leere ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc) { ngx_log_t *Protokoll; ngx_pool_t *Pool; Struktur, verweilen, verweilen; ngx_http_cleanup_t *cln; ngx_http_log_ctx_t *ctx; ngx_http_core_loc_conf_t *clcf; log = r->Verbindung->Protokoll; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, „http-Anforderung zum Schließen“); wenn (r->pool == NULL) { ngx_log_error(NGX_LOG_ALERT, log, 0, „http-Anfrage bereits geschlossen“); zurückkehren; } Zusammenfassen Dies ist das Ende dieses Artikels über die Zählverfolgung einer Anfrage in nginx. Weitere Informationen zur Zählverfolgung von nginx-Anfragen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! |
>>: Node-Skript realisiert automatische Anmelde- und Lotteriefunktion
1. Konstruktion 1. Bereiten Sie die Datei htpassw...
Dieser Artikel veranschaulicht anhand von Beispie...
Wählen Sie die Kategorieauswahl. Nach Tests könne...
Docker ist ein Verwaltungstool, das Prozesse als ...
Inhaltsverzeichnis Vorwort InnoDB-Speicherarchite...
>1 Starten Sie die Datenbank Geben Sie im cmd-...
Inhaltsverzeichnis Überblick 1. Trennung von Fron...
Finden Sie das Problem Als ich kürzlich die vorhe...
In diesem Artikelbeispiel wird der spezifische Co...
Der Code unter dem Easyui-Framework lautet wie fo...
Inhaltsverzeichnis iview-admin2.0 integrierte Ber...
Erstens: Installation von MySQL Laden Sie die MyS...
Inhaltsverzeichnis Erster Blick Erstellen einer V...
Externer Zugriff Ports nach dem Zufallsprinzip zu...
In letzter Zeit besteht eine wachsende Nachfrage ...