Проблема с выходом модуля nginx? Как это исправить?
Я новичок в nginx и пытаюсь разработать простой модуль nginx, в частности модуль обработчика. Хотя это не то, чем я действительно хочу заниматься, сначала я пытаюсь выполнить эту задачу. Я пытаюсь получить socketfd, когда браузер (или клиент) подключается к nginx. И я получаю его успешно. Однако когда я пытался вывести что-то с помощью dup2(), nginx всегда находится в режиме ожидания и просто ничего не выводит. Иногда я могу получить вывод через долгое время, и как только я остановлю nginx, как остановка nginx -s, и вывод появится немедленно.
Например: достичь http://100.100.60.199/nc?search=123456 get search = 123456 HTTP / 1.l HOST
Я читал некоторые блоги о модуле 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 ответ
Я наконец решил эту проблему, пытаясь понять, как именно работает nginx. Короче говоря, все, что мне нужно сделать, это добавить заголовок http в вывод. Но это не так просто, как я описал.