nginx输出问题

本文分享了在Nginx中开发自定义模块的过程,详细介绍了如何通过ngx_http_request_t结构体获取socketfd,以及在模块开发中遇到的输出问题和可能的解决方案。

尝试使用nginx module来获取连接的socketfd,查看了ngx_http_request_t和ngx_connection_t发现获取fd很简单,假设有个结构体ngx_http_request_t *r,则可以使用r->connection->fd得到连接的socketfd。

 

在自己的ngx_http_nc_module中尝试了一下,handler处理函数如下

 

在nginx源码目录中编译

./configure  --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/home/zbr/ngx_http_hello_module/ --add-module=/home/zbr/ngx_http_nc_module/

然后make

接下来不用make install(网上说会覆盖安装,我试过好像也没啥),进入objs文件夹,此时make生成的nginx二进制可执行文件已经在其中

将其拷贝到/usr/local/nginx/sbin/中cp -f nginx /usr/local/nginx/sbin/nginx

然后重启nginx(也可以再reload一下)

访问http://100.100.60.199/nc?search=123456,有时等待很久才会有输出,不过nginx一停止就有输出了

 

 

说明fd确实是拿到了,但nginx的输出存在问题,分析可能的原因:第一是nginx的模块一般有一个固定的模板,handler模块通常要按照获取location配置、生成合适的响应、发送响应头、发送响应体来写handler处理函数,而此处没有按照这种模板来写。这种模板写的最后输出是要构造ngx_chain_t类型的结构体,也就是nginx是以链式输出的,具体可以参照之前的handler模块hello module。可能是这里的原因导致了输出的问题。

 

第二可能是缓冲区的问题,所以在调试了之前的hello module并分析了一下输出后加上了上面的setsockopt函数,网上说好像可以处理缓冲区的问题,不过好像没什么用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值