关于nginx模块的输出问题?如何解决?

时间:2019-07-29 02:02:49

标签: nginx nginx-module

我是nginx的新手,我正在尝试开发一个简单的nginx模块,特别是处理程序模块。尽管这不是我真正想做的,但我还是先尝试完成此任务。当浏览器(或客户端)连接到nginx时,我试图获取socketfd。并且我已经成功获取它。但是,当我尝试使用dup2()输出某些内容时,nginx始终处于挂起状态,什么也不输出。有时我会在很长一段时间后获得输出,而一旦停止nginx就像nginx -s stop一样,输出会立即显示。

赞: 到达http://100.100.60.199/nc?search=123456 得到 搜索= 123456 HTTP / 1.l 主机

output

我读了一些有关nginx模块的博客,发现处理程序模块有自己的模式(据我了解?)。例如,输出应为nginx_chain_t,我应该构造该链而不是像常规的那样使用dup2 C代码。所以我想知道是否可以像下面的函数那样获得输出。

这是我的处理函数:

static ngx_int_t ngx_http_nc_handler(ngx_http_request_t *r){
    //ngx_int_t rc;
    ngx_socket_t connfd = r->connection->fd;
    int nZero=0;
    //if(setsockopt(connfd,SOL_SOCKET,SO_SNDBUF,(const void*)&nZero,sizeof(nZero))==0)
    if(setsockopt(connfd,IPPROTO_TCP,TCP_NODELAY,(const void*)&nZero,sizeof(int))==0){
        setbuf(stdout,NULL); 
        setbuf(stdin,NULL);
        setbuf(stderr,NULL);
        dup2(connfd,STDOUT_FILENO); 
        dup2(connfd,STDERR_FILENO);
        dup2(connfd,STDIN_FILENO);
        printf("%s\n", r->args.data);
        //close(connfd);
    }
    return NGX_OK;
}

所以我想知道这是否可行,如何使用上述方法使事情正确,或者有人可以说这是不可能的,而构建链是唯一的方法?

1 个答案:

答案 0 :(得分:0)

我终于通过尝试理解nginx的工作原理解决了这个问题。总之,我要做的就是在输出中添加一个http标头。但这并不是我所描述的那么简单。