Nginx模块编写:如何将请求转发到服务器?

时间:2019-03-18 11:57:49

标签: c nginx nginx-reverse-proxy nginx-module

我正在使用nginx作为反向代理,并且我一直在尝试编写一个处理传入请求的nginx模块,如果它喜欢请求中存在的某些HTTP标头,nginx将允许该请求到达受保护的服务器(在nginx代理后面)。现在,我已经成功实现了标头处理,但是我仍然想弄清楚如何将请求转发到服务器。

到目前为止,我已经研究了子请求,但是我尝试的所有代码(或从ngx_http_addition_filter_module之类的现有模块中复制的代码)似乎都无效。要么我陷入一个循环,其中触发了100多个子请求,要么什么都没有发生。我一直在尝试使用的代码:

static ngx_int_t ngx_http_my_own_handler(ngx_http_request_t *r)
{
    // some request processing here
    // ...


    // now issue the sub-request
    ngx_http_request_t *sr;
    ngx_http_post_subrequest_t *ps;

    ps = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));
    if (ps == NULL) {
        return NGX_ERROR;
    }

    ps->handler = ngx_http_foo_subrequest_done;
    ps->data = "foo";

    // re-use the request URI to try to forward it
    return ngx_http_subrequest(r, &r->uri, &r->args, &sr, ps, NGX_HTTP_SUBREQUEST_CLONE);
}

ngx_http_foo_subrequest_done处理程序如下所示:

ngx_int_t ngx_http_foo_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
{
    char *msg = (char *) data;
    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, "done subrequest r:%p msg:%s rc:%i", r, msg, rc);
    return rc;
}

请告知我我做错了!

1 个答案:

答案 0 :(得分:1)

代理无法正常工作……我也很惊讶!

需要在与配置文件中的location /...相对应的字符串中更改URI。然后proxy_...定义将包括实际的完整目的地。

由于路径是在变量中转换的,因此可以包含域名。因此,例如,您的URI可能是:

http://example.com/images/bunny.png

在您的模块中,将其转换为以下路径:

/example.com/images/bunny.png

然后在您的nginx.conf中,添加一个位置:

location /example.com {
    proxy_pass http://example.com;
}

正如我提到的,您可以将example.com部分设为变量,并在proxy_pass中使用它,如果您有许多目标域,这将非常有用。仅使用1到5,使用自己的location定义可能更容易处理每个人。