Heim Backend-Entwicklung PHP-Tutorial Nginx学习之三-ngx_http_request_t结构体

Nginx学习之三-ngx_http_request_t结构体

Jul 28, 2016 am 08:26 AM
http nbsp request

摘自: http://blog.csdn.net/xiajun07061225/article/details/9189505   江雨烟云的博客

ngx_http_request_s是nginx中非常重要的一个结构体,贯穿于htpp请求处理的整个过程中。

下面解释了ngx_http_request_s结构体中与HTTP框架相关的重要的成员变量。

[cpp] view plain copy print?

  1. struct ngx_http_request_s {  
  2.     uint32_t                          signature;         /* "HTTP" */  
  3.   
  4.     //请求对应的客户端连接  
  5.     ngx_connection_t                 *connection;  
  6.   
  7.     //指向存放所有HTTP模块的上下文结构体的指针数组  
  8.     void                            **ctx;  
  9.     //指向请求对应的存放main级别配置结构体的指针数组  
  10.     void                            **main_conf;  
  11.     //指向请求对应的存放srv级别配置结构体的指针数组  
  12.     void                            **srv_conf;  
  13.     //指向请求对应的存放loc级别配置结构体的指针数组  
  14.     void                            **loc_conf;  
  15.   
  16.     /* 
  17.      * 在接收完http头部,第一次在业务上处理http请求时,http框架提供的处理方法是ngx_http_process_request。 
  18.      但如果该方法无法一次处理完该请求的全部业务,在归还控制权到epoll时间模块后,该请求再次被回调时, 
  19.      将通过Ngx_http_request_handler方法来处理,而这个方法中对于可读事件的处理就是调用read_event_handler处理请求。 
  20.      也就是说,http模块希望在底层处理请求的读事件时,重新实现read_event_handler方法 
  21.     */  
  22.     ngx_http_event_handler_pt         read_event_handler;  
  23.     //与上面的方法类似  
  24.     ngx_http_event_handler_pt         write_event_handler;  
  25.   
  26. #if (NGX_HTTP_CACHE)  
  27.     ngx_http_cache_t                 *cache;  
  28. #endif  
  29.   
  30.     //upstream机制用到的结构体  
  31.     ngx_http_upstream_t              *upstream;  
  32.     ngx_array_t                      *upstream_states;  
  33.                                          /* of ngx_http_upstream_state_t */  
  34.   
  35.     //这个请求的内存池  
  36.     ngx_pool_t                       *pool;  
  37.     //用于接收http请求内容的缓冲区,主要接收http头部  
  38.     ngx_buf_t                        *header_in;  
  39.   
  40.     //ngx_http_process_request_headers在接收、解析完http请求的头部后,会把解析完的每一个http头部加入到headers_in的headers链表中,同时会构造headers_in中的其他成员  
  41.     ngx_http_headers_in_t             headers_in;  
  42.     //http模块会把想要发送的http相应信息放到headers_out中,期望http框架将headers_out中的成员序列化为http响应包发送给用户  
  43.     ngx_http_headers_out_t            headers_out;  
  44.   
  45.     //接收请求中包体的数据结构  
  46.     ngx_http_request_body_t          *request_body;  
  47.   
  48.     //延迟关闭连接的时间  
  49.     time_t                            lingering_time;  
  50.     //当前请求初始化时的时间  
  51.     time_t                            start_sec;  
  52.     ngx_msec_t                        start_msec;  
  53.   
  54.     //下面的9个成员是函数ngx_http_process_request_line方法在接收、解析http请求行时解析出的信息  
  55.     ngx_uint_t                        method;//方法名  
  56.     ngx_uint_t                        http_version;//协议版本  
  57.   
  58.     ngx_str_t                         request_line;  
  59.     ngx_str_t                         uri;//用户请求中的uri  
  60.     ngx_str_t                         args;//用户请求中的url参数  
  61.     ngx_str_t                         exten;//用户请求的文件扩展名  
  62.     ngx_str_t                         unparsed_uri;//没有进行URL解码的原始请求  
  63.   
  64.     ngx_str_t                         method_name;//用户请求中的方法名字符串  
  65.     ngx_str_t                         http_protocol;//其data成员指向请求中http起始地址  
  66.   
  67.     /*表示需要发送给客户端的http响应。out中保存着由headers_out中序列化后的表示http头部的TCP流。 
  68.      * 在调用ngx_http_output_filter方法后,out中还会保存着待发送的http包体,它是实现异步发送http响应的关键。*/  
  69.     ngx_chain_t                      *out;  
  70.     /*当前请求既有可能是用户发来的请求,也可能是派生出的子请求。 
  71.      * 而main标识一系列相关的派生子请求的原始请求。 
  72.      * 一般可通过main和当前请求的地址是否相等来判断当前请求是否为用户发来的原始请求。*/  
  73.     ngx_http_request_t               *main;  
  74.     //当前请求的父请求(不一定是原始请求)  
  75.     ngx_http_request_t               *parent;  
  76.     //与subrequest子请求相关的功能  
  77.     ngx_http_postponed_request_t     *postponed;  
  78.     ngx_http_post_subrequest_t       *post_subrequest;  
  79.     //所有的子请求都是通过这个单链表链接起来的  
  80.     ngx_http_posted_request_t        *posted_requests;  
  81.   
  82.     /*全局的ngx_http_phase_engine_t结构体中定义了一个ngx_http_phase_handler_t回答方法组成的数组。 
  83.      * 而phase_handler成员则与该数组配合使用。表示请求下次应当执行phase_handler作为序列号指定的数组中的回调方法*/  
  84.     ngx_int_t                         phase_handler;  
  85.     //表示NGX_HTTP_CONTENT_PHASE阶段提供给http模块处理请求的一种方式,它指向http模块实现的请求处理方法  
  86.     ngx_http_handler_pt               content_handler;  
  87.     //在NGX_HTTP_ACCESS_PHASE节点需要判断请求是否具有访问权限时,通过access_code来传递http模块的handler回调方法的返回值,如果为0表示具备权限。否则不具备。  
  88.     ngx_uint_t                        access_code;  
  89.   
  90.     ngx_http_variable_value_t        *variables;  
  91.   
  92. #if (NGX_PCRE)  
  93.     ngx_uint_t                        ncaptures;  
  94.     int                              *captures;  
  95.     u_char                           *captures_data;  
  96. #endif  
  97.   
  98.     size_t                            limit_rate;  
  99.   
  100.     /* used to learn the Apache compatible response length without a header */  
  101.     size_t                            header_size;  
  102.   
  103.     //http请求的全部长度,包括http包体  
  104.     off_t                             request_length;  
  105.   
  106.     ngx_uint_t                        err_status;  
  107.   
  108.     ngx_http_connection_t            *http_connection;  
  109. #if (NGX_HTTP_SPDY)  
  110.     ngx_http_spdy_stream_t           *spdy_stream;  
  111. #endif  
  112.   
  113.     ngx_http_log_handler_pt           log_handler;  
  114.   
  115.     //在这个请求中如果打开了某些资源,并需要在请求结束时释放,那么需要把定义的释放资源的方法添加到这个成员  
  116.     ngx_http_cleanup_t               *cleanup;  
  117.   
  118.     unsigned                          subrequests:8;  
  119.     //引用计数一般都作用于这个请求的原始请求上  
  120.     //引用计数,每当派生出子请求时,原始请求的count成员都会加一  
  121.     unsigned                          count:8;  
  122.     //阻塞标志位,目前仅由aio使用  
  123.     unsigned                          blocked:8;  
  124.   
  125.     //标志位:为1表示蛋清请求正在使用异步IO  
  126.     unsigned                          aio:1;  
  127.   
  128.     unsigned                          http_state:4;  
  129.   
  130.     /* URI with "/." and on Win32 with "//" */  
  131.     unsigned                          complex_uri:1;  
  132.   
  133.     /* URI with "%" */  
  134.     unsigned                          quoted_uri:1;  
  135.   
  136.     /* URI with "+" */  
  137.     unsigned                          plus_in_uri:1;  
  138.   
  139.     /* URI with " " */  
  140.     unsigned                          space_in_uri:1;  
  141.   
  142.     unsigned                          invalid_header:1;  
  143.   
  144.     unsigned                          add_uri_to_alias:1;  
  145.     unsigned                          valid_location:1;  
  146.     unsigned                          valid_unparsed_uri:1;  
  147.     //标志位:为1时表示URL发生过rewrite重写  
  148.     unsigned                          uri_changed:1;  
  149.     //表示使用rewrite重写URL的次数  
  150.     unsigned                          uri_changes:4;  
  151.   
  152.     unsigned                          request_body_in_single_buf:1;  
  153.     unsigned                          request_body_in_file_only:1;  
  154.     unsigned                          request_body_in_persistent_file:1;  
  155.     unsigned                          request_body_in_clean_file:1;  
  156.     unsigned                          request_body_file_group_access:1;  
  157.     unsigned                          request_body_file_log_level:3;  
  158.   
  159.     unsigned                          subrequest_in_memory:1;  
  160.     unsigned                          waited:1;  
  161.   
  162. #if (NGX_HTTP_CACHE)  
  163.     unsigned                          cached:1;  
  164. #endif  
  165.   
  166. #if (NGX_HTTP_GZIP)  
  167.     unsigned                          gzip_tested:1;  
  168.     unsigned                          gzip_ok:1;  
  169.     unsigned                          gzip_vary:1;  
  170. #endif  
  171.   
  172.     unsigned                          proxy:1;  
  173.     unsigned                          bypass_cache:1;  
  174.     unsigned                          no_cache:1;  
  175.   
  176.     /* 
  177.      * instead of using the request context data in 
  178.      * ngx_http_limit_conn_module and ngx_http_limit_req_module 
  179.      * we use the single bits in the request structure 
  180.      */  
  181.     unsigned                          limit_conn_set:1;  
  182.     unsigned                          limit_req_set:1;  
  183.   
  184. #if 0  
  185.     unsigned                          cacheable:1;  
  186. #endif  
  187.   
  188.     unsigned                          pipeline:1;  
  189.     unsigned                          chunked:1;  
  190.     unsigned                          header_only:1;  
  191.     //标志位,为1表示当前请求时keepalive请求  
  192.     unsigned                          keepalive:1;  
  193.     //延迟关闭标志位  
  194.     unsigned                          lingering_close:1;  
  195.     //标志位:为1表示正在丢弃http请求中的包体  
  196.     unsigned                          discard_body:1;  
  197.     //标志位:为1表示请求的当前状态是在做内部跳转  
  198.     unsigned                          internal:1;  
  199.     unsigned                          error_page:1;  
  200.     unsigned                          ignore_content_encoding:1;  
  201.     unsigned                          filter_finalize:1;  
  202.     unsigned                          post_action:1;  
  203.     unsigned                          request_complete:1;  
  204.     unsigned                          request_output:1;  
  205.     //标志位:为1表示发生给客户端的http响应头已经发送  
  206.     unsigned                          header_sent:1;  
  207.     unsigned                          expect_tested:1;  
  208.     unsigned                          root_tested:1;  
  209.     unsigned                          done:1;  
  210.     unsigned                          logged:1;  
  211.   
  212.     //标志位,表示缓冲中是否有待发送内容  
  213.     unsigned                          buffered:4;  
  214.   
  215.     unsigned                          main_filter_need_in_memory:1;  
  216.     unsigned                          filter_need_in_memory:1;  
  217.     unsigned                          filter_need_temporary:1;  
  218.     unsigned                          allow_ranges:1;  
  219.   
  220. #if (NGX_STAT_STUB)  
  221.     unsigned                          stat_reading:1;  
  222.     unsigned                          stat_writing:1;  
  223. #endif  
  224.   
  225.     /* used to parse HTTP headers */  
  226.   
  227.     //状态机解析http时使用state来表示当前的解析状态,需要检查是否构成完成的http请求行  
  228.     ngx_uint_t                        state;  
  229.   
  230.     ngx_uint_t                        header_hash;  
  231.     ngx_uint_t                        lowcase_index;  
  232.     u_char                            lowcase_header[NGX_HTTP_LC_HEADER_LEN];  
  233.   
  234.     u_char                           *header_name_start;  
  235.     u_char                           *header_name_end;  
  236.     u_char                           *header_start;  
  237.     u_char                           *header_end;  
  238.   
  239.     /* 
  240.      * a memory that can be reused after parsing a request line 
  241.      * via ngx_http_ephemeral_t 
  242.      */  
  243.   
  244.     u_char                           *uri_start;  
  245.     u_char                           *uri_end;  
  246.     u_char                           *uri_ext;  
  247.     u_char                           *args_start;  
  248.     u_char                           *request_start;  
  249.     u_char                           *request_end;  
  250.     u_char                           *method_end;  
  251.     u_char                           *schema_start;  
  252.     u_char                           *schema_end;  
  253.     u_char                           *host_start;  
  254.     u_char                           *host_end;  
  255.     u_char                           *port_start;  
  256.     u_char                           *port_end;  
  257.   
  258.     unsigned                          http_minor:16;  
  259.     unsigned                          http_major:16;  
  260. }; 

以上就介绍了 Nginx学习之三-ngx_http_request_t结构体,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1658
14
PHP-Tutorial
1257
29
C#-Tutorial
1231
24
Lösung: Ihre Organisation verlangt von Ihnen, dass Sie Ihre PIN ändern Lösung: Ihre Organisation verlangt von Ihnen, dass Sie Ihre PIN ändern Oct 04, 2023 pm 05:45 PM

Auf dem Anmeldebildschirm wird die Meldung „Ihre Organisation hat Sie gebeten, Ihre PIN zu ändern“ angezeigt. Dies geschieht, wenn das PIN-Ablauflimit auf einem Computer erreicht wird, der organisationsbasierte Kontoeinstellungen verwendet und die Kontrolle über persönliche Geräte hat. Wenn Sie Windows jedoch über ein persönliches Konto einrichten, sollte die Fehlermeldung im Idealfall nicht erscheinen. Obwohl dies nicht immer der Fall ist. Die meisten Benutzer, die auf Fehler stoßen, melden dies über ihre persönlichen Konten. Warum fordert mich meine Organisation auf, meine PIN unter Windows 11 zu ändern? Es ist möglich, dass Ihr Konto mit einer Organisation verknüpft ist. Ihr primärer Ansatz sollte darin bestehen, dies zu überprüfen. Die Kontaktaufnahme mit Ihrem Domain-Administrator kann hilfreich sein! Darüber hinaus können falsch konfigurierte lokale Richtlinieneinstellungen oder falsche Registrierungsschlüssel Fehler verursachen. Im Augenblick

So passen Sie die Fensterrahmeneinstellungen unter Windows 11 an: Farbe und Größe ändern So passen Sie die Fensterrahmeneinstellungen unter Windows 11 an: Farbe und Größe ändern Sep 22, 2023 am 11:37 AM

Windows 11 bringt frisches und elegantes Design in den Vordergrund; die moderne Benutzeroberfläche ermöglicht es Ihnen, feinste Details, wie zum Beispiel Fensterränder, zu personalisieren und zu ändern. In diesem Leitfaden besprechen wir Schritt-für-Schritt-Anleitungen, die Ihnen dabei helfen, eine Umgebung zu erstellen, die Ihrem Stil im Windows-Betriebssystem entspricht. Wie ändere ich die Fensterrahmeneinstellungen? Drücken Sie +, um die Einstellungen-App zu öffnen. WindowsIch gehe zu Personalisierung und klicke auf Farbeinstellungen. Farbänderung Fensterränder Einstellungen Fenster 11" Breite="643" Höhe="500" > Suchen Sie die Option Akzentfarbe auf Titelleiste und Fensterrändern anzeigen und schalten Sie den Schalter daneben um. Um Akzentfarben im Startmenü und in der Taskleiste anzuzeigen Um die Designfarbe im Startmenü und in der Taskleiste anzuzeigen, aktivieren Sie „Design im Startmenü und in der Taskleiste anzeigen“.

Anleitung zur Anzeigeskalierung unter Windows 11 Anleitung zur Anzeigeskalierung unter Windows 11 Sep 19, 2023 pm 06:45 PM

Wir alle haben unterschiedliche Vorlieben, wenn es um die Anzeigeskalierung unter Windows 11 geht. Manche Leute mögen große Symbole, andere mögen kleine Symbole. Wir sind uns jedoch alle einig, dass die richtige Skalierung wichtig ist. Eine schlechte Schriftartenskalierung oder eine Überskalierung von Bildern kann bei der Arbeit ein echter Produktivitätskiller sein. Sie müssen daher wissen, wie Sie sie anpassen können, um die Fähigkeiten Ihres Systems optimal zu nutzen. Vorteile des benutzerdefinierten Zooms: Dies ist eine nützliche Funktion für Personen, die Schwierigkeiten haben, Text auf dem Bildschirm zu lesen. Es hilft Ihnen, mehr gleichzeitig auf dem Bildschirm zu sehen. Sie können benutzerdefinierte Erweiterungsprofile erstellen, die nur für bestimmte Monitore und Anwendungen gelten. Kann dazu beitragen, die Leistung von Low-End-Hardware zu verbessern. Dadurch haben Sie mehr Kontrolle darüber, was auf Ihrem Bildschirm angezeigt wird. So verwenden Sie Windows 11

10 Möglichkeiten, die Helligkeit unter Windows 11 anzupassen 10 Möglichkeiten, die Helligkeit unter Windows 11 anzupassen Dec 18, 2023 pm 02:21 PM

Die Bildschirmhelligkeit ist ein wesentlicher Bestandteil der Nutzung moderner Computergeräte, insbesondere wenn Sie über einen längeren Zeitraum auf den Bildschirm schauen. Es hilft Ihnen, die Belastung Ihrer Augen zu reduzieren, die Lesbarkeit zu verbessern und Inhalte einfach und effizient anzuzeigen. Abhängig von Ihren Einstellungen kann es jedoch manchmal schwierig sein, die Helligkeit zu verwalten, insbesondere unter Windows 11 mit den neuen Änderungen an der Benutzeroberfläche. Wenn Sie Probleme beim Anpassen der Helligkeit haben, finden Sie hier alle Möglichkeiten, die Helligkeit unter Windows 11 zu verwalten. So ändern Sie die Helligkeit unter Windows 11 [10 Möglichkeiten erklärt] Benutzer eines einzelnen Monitors können die folgenden Methoden verwenden, um die Helligkeit unter Windows 11 anzupassen. Hierzu zählen sowohl Desktop-Systeme mit einem einzelnen Monitor als auch Laptops. Lasst uns beginnen. Methode 1: Verwenden Sie das Action Center. Das Action Center ist zugänglich

Was bedeutet der http-Statuscode 520? Was bedeutet der http-Statuscode 520? Oct 13, 2023 pm 03:11 PM

Der HTTP-Statuscode 520 bedeutet, dass der Server bei der Verarbeitung der Anfrage einen unbekannten Fehler festgestellt hat und keine genaueren Informationen bereitstellen kann. Wird verwendet, um darauf hinzuweisen, dass bei der Verarbeitung der Anforderung durch den Server ein unbekannter Fehler aufgetreten ist, der durch Serverkonfigurationsprobleme, Netzwerkprobleme oder andere unbekannte Gründe verursacht werden kann. Dies wird normalerweise durch Serverkonfigurationsprobleme, Netzwerkprobleme, Serverüberlastung oder Codierungsfehler verursacht. Wenn Sie auf einen Fehler mit dem Statuscode 520 stoßen, wenden Sie sich am besten an den Website-Administrator oder das technische Support-Team, um weitere Informationen und Unterstützung zu erhalten.

Wie deaktiviere ich die Authentifizierung beim privaten Surfen auf dem iPhone in Safari? Wie deaktiviere ich die Authentifizierung beim privaten Surfen auf dem iPhone in Safari? Nov 29, 2023 pm 11:21 PM

Mit iOS 17 hat Apple mehrere neue Datenschutz- und Sicherheitsfunktionen in sein mobiles Betriebssystem eingeführt, darunter die Möglichkeit, eine zweistufige Authentifizierung für private Browser-Tabs in Safari zu verlangen. Hier erfahren Sie, wie es funktioniert und wie Sie es ausschalten. Auf einem iPhone oder iPad mit iOS 17 oder iPadOS 17 erfordert der Browser von Apple jetzt eine Face ID/Touch ID-Authentifizierung oder einen Passcode, wenn Sie in Safari eine Registerkarte „Privates Surfen“ geöffnet haben und dann die Sitzung oder App verlassen, um erneut darauf zuzugreifen. Mit anderen Worten: Wenn jemand Ihr iPhone oder iPad in die Hände bekommt, während es entsperrt ist, kann er Ihre Privatsphäre trotzdem nicht einsehen, ohne Ihren Passcode zu kennen

Das digitale Aktivierungsskript für Win10/11 MAS Version 2.2 unterstützt erneut die digitale Aktivierung Das digitale Aktivierungsskript für Win10/11 MAS Version 2.2 unterstützt erneut die digitale Aktivierung Oct 16, 2023 am 08:13 AM

Das berühmte Aktivierungsskript MAS2.2 unterstützt wieder die digitale Aktivierung. Die Methode stammt von @asdcorp und der MAS-Autor nennt sie HWID2. Laden Sie „gatherosstate.exe“ (kein Original, geändert) von https://github.com/massgravel/Microsoft-Activation-Scripts herunter, führen Sie es mit Parametern aus und generieren Sie GenuineTicket.xml. Schauen Sie sich zunächst die ursprüngliche Methode an: Gatherosstate.exePfn=xxxxxxx;DownlevelGenuineState=1 und vergleichen Sie sie dann mit der neuesten Methode: Gatheros

So blenden Sie Ordner unter Windows 11 ein und aus (3 Möglichkeiten) So blenden Sie Ordner unter Windows 11 ein und aus (3 Möglichkeiten) Sep 23, 2023 am 08:37 AM

Das Ausblenden von Ordnern ist eine großartige Möglichkeit, Ihren Desktop organisiert zu halten. Vielleicht möchten Sie Ihre persönlichen Dateien oder einige Kundendaten vor neugierigen Blicken schützen. Was auch immer es ist, die Möglichkeit, sie wegzuräumen und bei Bedarf wieder einzublenden, ist eine große Ersparnis. Kurz gesagt, diese versteckten Dateien werden nicht im Hauptmenü angezeigt, sind aber weiterhin zugänglich. Es ist sehr einfach und sollte nicht zu viel Zeit in Anspruch nehmen. Wie verstecke ich einen Ordner in Windows 11? 1. Verwenden Sie den Datei-Explorer und drücken Sie die +-Taste, um den Datei-Explorer zu öffnen. WindowsE Suchen Sie den Ordner, den Sie ausblenden möchten, klicken Sie mit der rechten Maustaste darauf und wählen Sie Eigenschaften. Navigieren Sie zur Registerkarte „Allgemein“, aktivieren Sie das Kontrollkästchen „Ausblenden“, klicken Sie auf „Übernehmen“ und dann auf „OK“. Aktivieren Sie im nächsten Dialogfeld die Option „Änderungen auf diesen Ordner und Unterordner anwenden“.

See all articles