nginx request

是当前的一个请求中Nginx再生成一个请求,一个子请求是要等到父请求执行完以后才会去被执行的,这里有一个比较重要的filter,那就是postpone filter ,
.request的三个域
//这个表示主的request,也就是当前的request链中最上面的那个request,通过这个域我们就能判断当前的request是不是subrequest。
ngx_http_request_t *main;
//这个表示当前的request的父request。
ngx_http_request_t *parent;
//最关键就是下面三个域。
ngx_http_postponed_request_t *postponed;
ngx_http_post_subrequest_t *post_subrequest;
ngx_http_posted_request_t *posted_requests;
1.postponed:这个域用来缓存父request的数据,也就是将要发送数据的request,缓存的动作是在postone filter中来做的
struct ngx_http_postponed_request_s {
ngx_http_request_t *request;
ngx_chain_t *out;
ngx_http_postponed_request_t *next;
};
可以看到它就是一个很简单的链表,三个域的意思分别为:
request 保存了subrequest
out保存了所需要发送的chain。
next保存了下一个postpone_request.

2.然后是post_subrequest,这个域保存了子请求的post request,它也就是保存了需要被发送的request. 来看它的结构:
typedef struct {
ngx_http_post_subrequest_pt handler;
void *data;
} ngx_http_post_subrequest_t
data是要传递的数据,
handler是到时候需要执行的函数
3.最后是posted_requests,这个保存了所有的需要处理的request链表,也就是说它即包含子请求也包含父请求。来看它的结构:
struct ngx_http_posted_request_s {
ngx_http_request_t *request;
ngx_http_posted_request_t *next;
};
4.sub_request的处理流程:
设置sub_request的函数:ngx_http_subrequest
ngx_int_t
ngx_http_subrequest(ngx_http_request_t *r,
ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,
ngx_http_post_subrequest_t *ps, ngx_uint_t flags)
//主要用于新建一个子请求,然后设置对应得属性,
//subrequest表示了当前还可以处理的最大个数的sub request,这个值的默认值是50.表示nginx中能够处理的最多的嵌套子请求的个数是50.
r->main->subrequests–;
//新建一个sub request。
sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));
对子请求一部分的初始化是和父请求是一样的,比如http的版本,方法,且子请求的方法一般是get方法
接下来这段也是初始化,只不过主要是初始化一些sub request特有的属性。这里最关键的就是两个事件处理函数的赋值,read_event_handler和write_event_handler 。其中读事件的handler被赋值为一个空的函数,也就是在sub request中,不会处理读事件。而写事件的handler被赋值为ngx_http_handler,这个函数我们知道,它就是整个nginx的handler处理的入口,因此也就是说sub request最终会把所有的phase再重新走一遍。

设置子请求的url,main属性,parent属性,post_subrequest属性,read/write_event handler;,uri和args是我们需要访问的后端服务器的url,而psr是subrequest执行完成后返回给我们的新的请求,即要访问后端服务器的请求指针,而ps指的是回调函数,也就是该请求执行完毕接收到后端响应以后回调的函数,flag指明子请求的一些特征

设置连接的request为子请求。这里的意思是如果父请求设置第二个子请求的话,这里就不需要设置连接的request了。
if (c->data == r && r->postponed == NULL) {
c->data = sr;
}
//开始赋值postponed request.
pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));
if (pr == NULL) {
return NGX_ERROR;
}
//它的request设置为子请求,也就是每个子请求都会用一个postponed request包装起来。
pr->request = sr;
那么将pr放到postponed链表
/设置post request。
return ngx_http_post_request(sr)//这个函数是将subrequest放入post request中的
5.postpone filter:
缓存父request的chain, 并且控制sub request的发送
6.举例:

ngx_http_post_subrequest_t *psr = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));

if (psr == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}

psr->handler = ngx_http_my_post_subrequest;
psr->data = ctx;
ngx_flag_t flag = NGX_HTTP_SUBREQUEST_IN_MEMORY
ngx_str_t sub_location = ngx_string(“/testlocation”);
ngx_str_t sub_args = ngx_string(“para=1”);;
rc = ngx_http_subrequest(r, &sub_location, &url_args, &sr, psr, sr_flag);
这样在subrequest执行完成以后就会回调ngx_http_my_post_handler方法,这个函数是开发者实现的,但是注意此时拿到的是子请求,
此时如果需要在父请求的上下文中处理这个请求的话,可以在以在ngx_http_my_post_subrequest中找到父请求的handler,设置为一个处理函数即可。比如:
ngx_http_my_post_subrequest执行完毕后,nginx开始换醒父请求,这时ngx_http_parent_handler将会被调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值