ngx_http_request_t是一个重要的结构体,每一个http请求都会有自己的ngx_http_request_t结构,ngx_http_create_request函数初始化了一个ngx_http_request_t结构。主要代码和解析如下。


ngx_connection_t结构中的requests字段代表了某一个连接处理的请求个数,如果在长连接模式下,一个连接可能会处理若干个请求。在配置文件中指定的log_format中添加$connection_requests字段,就是由这个变量获取到的结果。

c->requests++;

ngx_http_request_t结构中main变量作用于当请求派生了子请求时,子请求又可能有自己的子请求,但是不管怎么派生,他们的main变量都是辈分最高的那一个请求。

r->main = r;

count变量作用于当请求派生出其他请求时,包括子请求,内部重定向,upstream等等。每次派生出一个请求,count值就会加一。

r->count = 1;

us_tries变量作用于当请求要经历upstream过程时。假设upstream块中配置了n个host,如果第一个host没有连接成功,会执行ngx_http_upstream_next函数,也即尝试连接下一个host。us_tries变量每次会加一,与配置文件中配置的次数限制做对比。

r->us_tries = 1;

请求开始计时,如果log_format中指定打印$request_time,在请求结束之后,再记录时间,两个时间的差值就是$request_time的值。

if (clcf->request_time_cache) {
    tp = ngx_timeofday();
    r->start_sec = tp->sec;
    r->start_msec = tp->msec;
    r->start_usec = tp->usec;
} else {
    ngx_gettimeofday(&tv);
    r->start_sec = tv.tv_sec;
    r->start_msec = tv.tv_usec / 1000;
    r->start_usec = tv.tv_usec % 1000;
}

uri_changes变量作用于当uri发生变化的时候,包括内部重定向,rewrite。默认初始化为11,每次发生变化都会减一,也即最多变10次,防止无限的重定向或者无限的rewrite死循环这种现象。

r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;

请求有可能派生子请求,但是每个请求派生出来的子请求的个数有限制,默认为200个子请求。每次新生成一个子请求,都会加一,每次一个子请求完结,都会减一。

r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1;