子请求未发送或请求挂起
Subrequests are not sent or the request hangs
我正在尝试用 C(必须是 C)为 Nginx 1.7.12 编写自己的模块。
它的目的是在代理请求到达 Nginx 时向另一台服务器发送额外的请求。
为此,我在配置中创建了两个位置:
location = / {
proxy_pass $backend_url;
}
location /internal_url {
proxy_pass $log_server_url;
internal;
}
我使用了 here 中的示例来创建如下所示的过滤器:
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
和 subrequest->done
,但我只能让请求挂起。
然后,事实证明,当我在 ngx_http_subrequest
调用之后添加 return NGX_AGAIN;
时,子请求实际上已发送(因此配置正常)。
不幸的是,原始请求永远不会完成。
应该怎么做?
这可能有用吗?
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 */);
}
更新:
经过一番调查,这是一个新版本:
gist
很遗憾,我目前没有机会测试我的代码。
更新
上面的代码在收到完整的正文后发送子请求。
另一种可能的方法是在第一个块上发送它并在上下文中存储标志。
我正在尝试用 C(必须是 C)为 Nginx 1.7.12 编写自己的模块。 它的目的是在代理请求到达 Nginx 时向另一台服务器发送额外的请求。
为此,我在配置中创建了两个位置:
location = / {
proxy_pass $backend_url;
}
location /internal_url {
proxy_pass $log_server_url;
internal;
}
我使用了 here 中的示例来创建如下所示的过滤器:
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
和 subrequest->done
,但我只能让请求挂起。
然后,事实证明,当我在 ngx_http_subrequest
调用之后添加 return NGX_AGAIN;
时,子请求实际上已发送(因此配置正常)。
不幸的是,原始请求永远不会完成。
应该怎么做?
这可能有用吗?
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 */);
}
更新:
经过一番调查,这是一个新版本: gist
很遗憾,我目前没有机会测试我的代码。
更新
上面的代码在收到完整的正文后发送子请求。 另一种可能的方法是在第一个块上发送它并在上下文中存储标志。