nginx如何响应客户端

在之前的工作中,我使用ngx_http_send_header和ngx_http_output_filter响应客户端。但是在实际的测试中遇到很多问题,例如ngx_http_output_filter在某些时候常常返回NGX_ERROR或是NGX_AGAIN。所以我不得不深入这个函数,找出其中的原因。

一哥们的博文《ngx的filter处理》(http://simohayha.iteye.com/blog/642314)介绍了filter的工作原理。

但还不能用于解决我的问题。这篇文章中说, ngx_http_write_filter_module和ngx_http_header_filter_module

分别是body filter和header filter的第一个初始化模块。这个模块完成了发送数据的主要任务。

在文件ngx_http_write_filter_module.c中,有函数ngx_http_write_filter。

ngx_http_write_filter(ngx_http_request *r, ngx_chain_t *in ) {

……

chain->send_chain(c,c->out,limit);//这句代码完成了发送数据的任务

…….

}

而这个回调函数在哪里呢?

#if (NGX_HAVE_SENDFILE)
ngx_linux_sendfile_chain,
NGX_IO_SENDFILE
#else
ngx_writev_chain,
0
#endif

由上边的代码可知,如果启用了sendfile, chain->send_chain与前者对应,否则就是后者。

在我的开发环境中似乎是在文件ngx_linux_sendfile_chain.c中的函数:

ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t *limit) {

。。。。

}

///////////////////////////////////////////代码读到这里,我顿悟了////////////////////////////////////////////////////////////////////////////

为什么非得使用nginx自己定义的函数呢?为什么一定要了解那些复杂的层层嵌套呢?为什么

不直接利用socket发送需要传输的内容呢?源代码,去屎吧!我再也不管代码结构是否美观了,

只要功能出来即可!

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

虽说要抛开nginx自带的HTTP响应函数,但是,我还是要了解结构ngx_http_request_t  *r中一些字段的

含义。这样才可以提取出自己需要的信息。

r->headers_out保存了关于一些关于服务器回复客户端的HTTP头的信息。下面,我们来关注一下

ngx_http_headers_out_t这个结构。

在ngx_http_request.h这个文件中,定义了此结构

typedef struct {

……
ngx_uint_t status;//此处保存了回复客户端的状态码,直接使用即可

ngx_table_elt_t *server;//此处保存了

ngx_table_elt_t *date;//

}

其中ngx_table_elt_t的定义如下:

typedef struct {

ngx_uint_t hash;

ngx_str_t   key;

ngx_str_t   value;

u_cahr       *lowcase_key;

}

其中ngx_str_t的定义如下:

typedef struct {

size_t    len;

u_char  *data;

} ngx_str_t

/////////////////////////////////////不对,我需要的信息不在此结构中///////////////////////////////////////////////////////////

ngx_http_headers_out_t这个结构的内容应当在filter中被填充,而目前,我添加代码

的地方还没有进行到这一步,看来我将不得不研究一下此过程中涉及到的所有filter。

只好放弃先前思路,正是:几行代码无我份,一场辛苦为谁忙。

发表评论

邮箱地址不会被公开。