我试图用C编写我自己的模块(它必须是C),Nginx 1.7.12。 当代理请求到达Nginx时,它意味着发送额外的请求到另一台服务器。
为此,我在config中创build了两个位置:
location = / { proxy_pass $backend_url; } location /internal_url { proxy_pass $log_server_url; internal; }
我用这里的例子来创build一个如下所示的filter:
static ngx_int_t my_http_body_filter(ngx_http_request_t* r, ngx_chain_t* in) { int rc; ngx_str_t uri = SOME_INTERNAL_URI; ngx_http_request_t *sr; rc = ngx_http_next_body_filter(r, in); if (rc == NGX_ERROR) return rc; return ngx_http_subrequest(r, &uri, NULL /* args */, &sr, NULL /* callback */, 0 /* flags */); }
起初,这似乎是从不发送子请求。 我已经尝试了NGX_AGAIN
和NGX_AGAIN
subrequest->done
但是我只能使请求挂起。
然后,事实certificate,subrequests,实际上,发送(所以configuration是好的),当我添加return NGX_AGAIN;
,之后调用ngx_http_subrequest
。
不幸的是,原来的请求永远不会结束。
这应该怎么做?
可能这会工作吗?
static ngx_int_t my_http_body_filter(ngx_http_request_t* r, ngx_chain_t* in) { int rc; ngx_str_t uri = SOME_INTERNAL_URI; ngx_http_request_t *sr; if (r != r->main) { /* subrequest */ return ngx_http_next_body_filter(r, in); } return ngx_http_subrequest(r, &uri, NULL /* args */, &sr, NULL /* callback */, 0 /* flags */); }
更新:
经过一番调查,这是一个新的版本: 要点
不幸的是,我现在没有机会测试我的代码。
更新
上面的代码收到全身发送子请求。 另一种可能的方法是在上下文中首先发送它并存储标志。