Detaillierte Analyse jeder Phase der HTTP-Anforderungsverarbeitung von Nginx

Detaillierte Analyse jeder Phase der HTTP-Anforderungsverarbeitung von Nginx

Beim Schreiben des HTTP-Moduls von nginx müssen die HTTP-Anforderungen in jeder Phase entsprechend verarbeitet werden, um unterschiedliche Zwecke zu erreichen, z. B. ob beim Initiieren der Anforderung eine Zugriffsberechtigung vorliegt, ob beim Generieren des Inhalts eine Filterung oder andere Verarbeitung erfolgt usw. Wenn die im kompilierten Nginx-Modul eingetragene Verarbeitungsphase nicht korrekt ist, kann es sein, dass das gewünschte Ergebnis nicht erreicht wird. Beispielsweise ist der zu verarbeitende Inhalt zu diesem Zeitpunkt tatsächlich nicht verfügbar usw.

In nginx werden mehrere Phasentypen definiert, um unterschiedliche Verarbeitungsanforderungen zu erfüllen (in ngx_http_core_module.h sind verschiedene Versionen unterschiedlich):

Typdefinition Aufzählung {
 NGX_HTTP_POST_READ_PHASE = 0,
 
 NGX_HTTP_SERVER_REWRITE_PHASE,
 
 NGX_HTTP_FIND_CONFIG_PHASE,
 NGX_HTTP_REWRITE_PHASE,
 NGX_HTTP_POST_REWRITE_PHASE,
 
 NGX_HTTP_PREACCESS_PHASE,
 
 NGX_HTTP_ACCESS_PHASE,
 NGX_HTTP_POST_ACCESS_PHASE,
 
 NGX_HTTP_TRY_FILES_PHASE,
 NGX_HTTP_CONTENT_PHASE,
 
 NGX_HTTP_LOG_PHASE
} ngx_http_phases;

Die entsprechenden Bedeutungen sind:

NGX_HTTP_POST_READ_PHASE = 0 // Anforderungsphase lesen NGX_HTTP_SERVER_REWRITE_PHASE // URI-Konvertierungsphase NGX_HTTP_FIND_CONFIG_PHASE // Entsprechende Konfiguration suchen, um die Phase auszuführen NGX_HTTP_REWRITE_PHASE // URI-Konvertierungsphase (hier nicht ganz klar)
NGX_HTTP_POST_REWRITE_PHASE //Phase der Verarbeitung des konvertierten URL-Ergebnisses NGX_HTTP_PREACCESS_PHASE //Phase der Vorbereitung der Berechtigungsprüfung NGX_HTTP_ACCESS_PHASE //Phase der Berechtigungsprüfung NGX_HTTP_POST_ACCESS_PHASE //Phase der Verarbeitung des Ergebnisses der Berechtigungsprüfung NGX_HTTP_TRY_FILES_PHASE //Verarbeitung der Try_Files-Phase in der Konfiguration NGX_HTTP_CONTENT_PHASE //Phase der Verarbeitung der generierten Rückgabedaten (wird hier nicht zu detailliert betrachtet, Filter können natürlich ignoriert werden)
NGX_HTTP_LOG_PHASE // Notieren Sie die Protokollverarbeitungsphase, die nach Abschluss der Anforderung und beim Schließen der Anforderung verarbeitet werden soll

Anhand dieser Konfiguration können wir den gesamten Prozess von nginx bei der Verarbeitung von Anfragen analysieren. Der Prozess wird von Anfang bis Ende ausgeführt. Es ist ersichtlich, dass LOG am Ende ausgeführt wird. Die Verarbeitung von Inhaltssegmenten erfolgt im Allgemeinen im Filtermodul. Das im Stadium NGX_HTTP_LOG_PHASE registrierte Verarbeitungssegment kann die zurückgegebenen Daten nicht abrufen. Die zurückgegebenen Daten werden direkt freigegeben, nachdem sie an den Client gesendet wurden. Daher sollte bei der Verarbeitung jeder Phase der Datenvorbereitungsstatus jeder Phase klar sein.

Normalerweise können wir unser eigenes Verarbeitungsmodul folgendermaßen registrieren:

statisches ngx_int_t
ngx_http_xxx_init(ngx_conf_t *cf)
{
 ngx_http_handler_pt *h;
 ngx_http_core_main_conf_t *cmcf;
 
 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
 
 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
 wenn (h == NULL) {
 gib NGX_ERROR zurück;
 }
 
 *h = ngx_http_xxx_handler;
 
 gib NGX_OK zurück;
}

Und der Rückgabewert von ngx_http_xxx_up_handler kann nur der folgende sein:

NGX_OK //Verarbeitung erfolgreich, gehe zur nächsten StufeNGX_DECLINED //Verarbeitung abbrechenNGX_AGAIN || NGX_DONE //Verarbeitung abgeschlossen, die Rückgabe dieses Wertes löst eine Anfrage ausNGX_ERROR || NGX_HTTP_.. //Verarbeitungsfehler oder andere Statuswerte von HTTP

Darüber hinaus gibt es für die Phase NGX_HTTP_CONTENT_PHASE tatsächlich eine weitere Möglichkeit zur Registrierung, und zwar so:

statisches Zeichen *
ngx_http_xxx_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
 ngx_str_t *Wert;
 ngx_url_t u;
 ngx_http_core_loc_conf_t *clcf;
 
 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
 
 clcf->handler = ngx_http_xxx_handler;
 
 wenn (clcf->name.data[clcf->name.len - 1] == '/') {
 clcf->auto_redirect = 1;
 }
 
 gib NGX_CONF_OK zurück;
}

Auf diese Weise müssen Sie jedoch zu viel tun. In den meisten Fällen müssen Sie eine Upstream-Integration oder eine spezielle Verarbeitung von Anforderungen in Betracht ziehen. Bei der verteilten Speicherverteilung ist es beispielsweise erforderlich, die Anforderungsverarbeitung mit dem Dateisystem zu verknüpfen, z. B. indem die angeforderten Daten direkt an einen speziellen SERVER übergeben werden, um den Inhalt abzurufen. hehe.

Damit ist dieser Artikel über die detaillierte Analyse jeder Phase der HTTP-Anforderungsverarbeitung von nginx abgeschlossen. Weitere Informationen zur HTTP-Anforderungsverarbeitung von nginx 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!

Das könnte Sie auch interessieren:
  • Nginx implementiert ein Codebeispiel für die https-Websitekonfiguration
  • Detailliertes Tutorial zur Konfiguration von Nginx für https-verschlüsselten Zugriff
  • Implementierung der Nginx-Domänennamenweiterleitung für den HTTPS-Zugriff
  • Alibaba Cloud Nginx konfiguriert https, um ein Domänennamen-Zugriffsprojekt zu implementieren (grafisches Tutorial)
  • Nginx konfiguriert denselben Domänennamen, um sowohl den http- als auch den https-Zugriff zu unterstützen
  • Detaillierte Konfiguration von Nginx, das sowohl Http als auch Https unterstützt
  • Verwenden Sie nginx + sekundären Domänennamen + https-Unterstützung
  • Nginx übernimmt die Analyse des Implementierungsprozesses für HTTP-Anforderungen

<<:  Detaillierte Analyse der Syntax von Mysql-Updates zum Ändern mehrerer Felder und

>>:  Auszeichnungssprachen – Nochmal auflisten

Artikel empfehlen

Detaillierte Erklärung der MySQL-Injektion ohne Kenntnis des Spaltennamens

Vorwort Ich habe in letzter Zeit das Gefühl, dass...

Stellen Sie das Vue-Projekt auf einem Linux-Server bereit

Fall 1 vue-cli erstellt das vue3-Projekt, lädt da...

Zusammenfassung gängiger Fehler beim Entwurf von MySQL-Tabellen

Inhaltsverzeichnis Fehler 1: Zu viele Datenspalte...

So öffnen Sie Port 8080 auf dem Alibaba Cloud ECS-Server

Aus Sicherheitsgründen verfügt Alibaba Cloud Serv...

Detaillierte Erklärung des JSON-Dateischreibformats

Inhaltsverzeichnis Was ist JSON Warum diese Techn...

10 wichtige Unterschiede zwischen HTML5 und HTML4

HTML5 ist die nächste Version des HTML-Standards....

Elementui exportiert Daten in XLSX- und Excel-Tabellen

Kürzlich habe ich vom Vue-Projekt erfahren und bi...

Detailliertes Tutorial zum Bereitstellen von Springboot oder Nginx mit Kubernetes

1 Einleitung Nachdem „Maven Springboot mit einem ...

Bootstrap 3.0 Studiennotizen Grid-System-Fall

Vorwort Im vorherigen Artikel haben wir hauptsäch...

VSCode-Entwicklung UNI-APP Konfigurations-Tutorial und Plugin

Inhaltsverzeichnis Vorne geschrieben Vorsichtsmaß...