尝试使用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函数,网上说好像可以处理缓冲区的问题,不过好像没什么用。
本文分享了在Nginx中开发自定义模块的过程,详细介绍了如何通过ngx_http_request_t结构体获取socketfd,以及在模块开发中遇到的输出问题和可能的解决方案。
898

被折叠的 条评论
为什么被折叠?



