Nginx访问上游服务器的流程大致分以下几个阶段:启动upstream.连接上游服务器.向上游发送请求.接收上游响应(包头/包体).结束请求. upstream相关的两个重要数据结构ngx_http_upstream_t和ngx_http_upstream_conf_t /* upstream有3种处理上游响应包体的方式,但HTTP模块如何告诉 upstream使用哪一种方式处理上游的响应包体呢?当请求的ngx_http_request_t结构体中 subrequest_in_memory标志位…
在 ngx_http_wait_request_handler 的最后调用了 ngx_http_process_request_line 函数用来处理和解析这次请求的全文 在读事件被触发时,内核套接字缓冲区的大小未必足够接收到全部的HTTP请求行:所以可能多次调用ngx_http_process_request_line方法去做完这项工作--------ngx_http_process_request_line方法也会作为读事件的回调方法,它可能会被epoll这个事件驱动机制多次调度,反复地接收…
对于活跃的 HTTP 连接,在执行连接建立回调函数 ngx_http_init_connection 的过程中会执行 ngx_http_wait_request_handler 回调函数, 负责 HTTP 请求的接收与 HTTP 请求描述结构的创建和初始化,并且第一次读取客户端数据到数据. 因此当客户端连接建立成功后,只有第一次读取客户端数据才会走该函数,如果在保活期内又收到客户端请求,则不会再走该函数,而是执行ngx_http_process_request_line, 因为该函数把handl…
ngx_http_process_request如果设置了定时器则删除,既然所有的请求已经接收完毕,就不会再发生超时了 重设连接的读写回调函数 重设请求读事件回调函数 调用 ngx_http_handler 处理 HTTP 请求的 11 个阶段 调用 ngx_http_run_posted_requests 处理 posted_requests 队列中的 POST 请 /* ngx_http_process_request方法负责在接收完HTTP头部后,第一次与各个HTTP模块共同按阶段处理请求…
HTTP 请求行正确处理完成后,针对 HTTP/1.0 及以上版本紧接着要做的就是请求 HEADER 的处理与解析了 /** * 用于处理http的header数据 * 请求头: * Host: localhost * User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 * Accept: text/html,application/xhtml+xml,application/xml;…
1. nginx 连接结构 ngx_connection_t 这个连接表示是客户端主动发起的.Nginx服务器被动接受的TCP连接,我们可以简单称其为被动连接.同时,在有些请求的处理过程中,Nginx会试图主动向其他上游服务器建立连接,并以此连接与上游服务器通信,因此,这样的连接与ngx_connection_t又是不同的,Nginx定义了ngx_peer_connection_t结构体来表示主动连接,当然,ngx_peer_connection_t主动连接是以ngx_connection-t结…
nginx 将一个 HTTP 请求分为 11 个处理阶段,这样做让每一个 HTTP 模块可以仅仅专注于完成一个独立.简单的功能,而一个请求的完整处理过程可以由多个 HTTP 模块共同合作完成将一次 HTTP 请求划分为 11 个处理阶段,通过每个阶段内部多个 HTTP 模块流水式的处理请求 HTTP 处理阶段枚举类型 -- ngx_http_phases ngx_http_phases定义的11个阶段是有顺序的,必须按照其定义的顺序执行.同时也要意识到,并不是说一个用户请求最多只能经过11个HT…
1. epoll模块命令集 ngx_epoll_commands  epoll模块上下文 ngx_epoll_module_ctx  epoll模块配置 ngx_epoll_module static ngx_command_t ngx_epoll_commands[] = { /* 在调用epoll_wait时,将由第2和第3个参数告诉Linux内核一次最多可返回多少个事件. 这个配置项表示调用一次epoll_wait时最多可返回 的事件数,当然,它也会预分配那么多epoll_event结构体…
在 http 配置块中,我们配置了 http 连接相关的信息,HTTP 框架也正是从这里启动的 在 nginx 初始化的过程中,执行了 ngx_init_cycle 函数,其中进行了配置文件解析,调用了 ngx_conf_parse 函数 函数 ngx_conf_handler 根据配置项的 command 调用了对应的 set 回调函数 // static ngx_command_t ngx_http_commands // http 模块命令结构 {{{ static ngx_command…