存档

2011年2月 的存档

nginx对TCP_CORK/TCP_NOPUSH的使用

2011年2月23日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: nginx对TCP_CORK/TCP_NOPUSH的使用

在nginx中使用了send_file 并且配合TCP_CORK/TCP_NOPUSH进行操作,我们一般的操作是这样子的,首先调用tcp_cork,阻塞下层的数据发送,然后调用send_file发送数据,最后关闭TCP_CORK/TCP_NOPUSH.而在nginx中不是这样处理的,前面两步都是一样的,最后一步,它巧妙的利用的http的特性,那就是基本都是短连接,也就是处理完当前的request之后,就会关闭当前的连接句柄,而在linux中,如果不是下面两种情况之一,那么关闭tcp句柄,就会发送完发送buf中的数据,才进行tcp的断开操作(具体可以看我以前写的那篇 “linux内核中tcp连接的断开处理”的 blog) :

1 接收buf中还有未读数据。
2 so_linger设置并且超时时间为0.

而如果调用shutdown来关闭写端的话,就是直接发送完写buf中的数据,然后发送fin。

ok,通过上面我们知道每次处理完请求,都会关闭连接(keepalive 会单独处理),而关闭连接就会帮我们将cork拔掉,所以这里就可以节省一个系统调用,从这里能看到nginx对细节的处理到了一个什么程度。

接下来还有一个单独要处理的就是keepalive的连接,由于keepalive是不会关闭当前的连接的,因此这里就必须显式的关闭tcp_cork。
阅读全文…

Share

nginx对keepalive和pipeline请求处理分析

2011年2月17日 4 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: nginx对keepalive和pipeline请求处理分析

这次主要来看nginx中对keepalive和pipeline的处理,这里概念就不用介绍了。直接来看nginx是如何来做的。

首先来看keepalive的处理。我们知道http 1.1中keepalive是默认的,除非客户端显式的指定connect头为close。下面就是nginx判断是否需要keepalive的代码。

void
ngx_http_handler(ngx_http_request_t *r)
{
.........................................
        switch (r->headers_in.connection_type) {
        case 0:
//如果版本大于1.0则默认是keepalive
            r->keepalive = (r->http_version > NGX_HTTP_VERSION_10);
            break;

        case NGX_HTTP_CONNECTION_CLOSE:
//如果指定connection头为close则不需要keepalive
            r->keepalive = 0;
            break;

        case NGX_HTTP_CONNECTION_KEEP_ALIVE:
            r->keepalive = 1;
            break;
        }
..................................
}

阅读全文…

Share
分类: nginx, server 标签: , , ,

nginx中request buf的设计和实现

2011年2月9日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: nginx中request buf的设计和实现

在nginx中request的buffer size我们能够通过两个命令进行设置,分别是large_client_header_buffers和client_header_buffer_size。这两个是有所不同的。
在解析request中,如果已经读取的request line 或者 request header大于lient_header_buffer_size的话,此时就会重新分配一块大的内存,然后将前面未完成解析的部分拷贝到当前的大的buf中,然后再进入解析处理,这部分的buf也就是large_client_header_buffers,也叫做large hader的处理。接下来我会通过代码来详细的分析这个过程。
阅读全文…

Share
分类: nginx, server 标签: ,