4

过滤器链最酷的部分是每个过滤器不会等待前一个过滤器完成;它可以在生成前一个过滤器的输出时对其进行处理,有点像 Unix 管道。(从这里

我猜上面是在每个过滤器末尾谈论这样的代码:

if (!chain_contains_last_buffer)
    return ngx_http_next_body_filter(r, in);

也就是,nginx 将过滤器一一链接起来。但是由于它在每个过滤器的末尾,它必须等到当前过滤器完成。我不明白 nginx 是如何做到的each filter doesn't wait for the previous filter to finish

所以上面是关于nginx过滤器的并发,接下来是关于nginx请求处理的并发:

我们知道 nginxepoll用来处理请求:

events = epoll_wait(ep, event_list, (int) nevents, timer);
for (i = 0; i < events; i++) {
   ...
   rev->handler(rev);
}

使用上面的代码,我不认为 nginx 可以同时处理两个请求,它只能一个一个地完成(每个都handler足够快地完成它的工作,所以下一个请求很快就会得到处理),对吧?

或者我有什么遗漏吗?

4

1 回答 1

1

有一种方法可以对此进行测试。编写一个休眠的过滤器,并在过滤器链中使用它。然后测试你是否可以让 nginx 在前一个请求处于休眠状态时为请求提供服务。

然后再次运行测试,但这次不要让过滤器休眠,使用选择超时让它等待,如下所示:

/* wait 1.5 secs */
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500000;
select(0, NULL, NULL, NULL, &tv);
于 2011-07-22T19:00:40.743 回答