【问题标题】:Subrequests are not sent or the request hangs子请求未发送或请求挂起
【发布时间】:2015-05-25 18:52:30
【问题描述】:

我正在尝试用 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_AGAINsubrequest->done,但我只能让请求挂起。

然后,当我在ngx_http_subrequest 调用之后添加return NGX_AGAIN; 时,实际上发送了子请求(所以配置是OK 的)。

很遗憾,原来的请求永远不会完成。

这应该怎么做?

【问题讨论】:

  • 你的 uri 是否匹配 nginx.conf 中的任何位置?如果我理解你的配置,它应该是'/internal_url'。
  • @Alexander Altshuler:匹配,(类似于“/internal_url/subpage”)

标签: c nginx


【解决方案1】:

这可能有用吗?

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

很遗憾,我目前没有机会测试我的代码。

更新

上面的代码在收到完整的正文时发送子请求。 另一种可能的方法是在第一个块上发送它并在上下文中存储标志。

【讨论】:

  • 它生成带有许多(可能是 255 个)子请求调用的循环,并且没有响应返回给客户端。但我会尝试一下。
  • 我添加了带有标志的上下文,所以ngx_http_subrequest 只被调用一次,结果我收到了curl: (18) transfer closed with XXX bytes remaining to read
  • gist.github.com/altexy/2e5a3f7737d3d5c58b00 工作,谢谢! (我可能会尝试修改它以设置标志,但至少我有一个开始的地方)
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2012-01-08
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多