Nginx模块编写:如何将请求转发到服务器?
Nginx module writing: how to forward request to server?
我正在使用 nginx 作为反向代理,我一直在尝试编写一个 nginx 模块来处理传入的请求,如果它喜欢请求中存在的某些 HTTP headers,nginx 将允许到达受保护服务器的请求(在 nginx 代理之后)。现在,我已经成功地实现了 header 处理,但我一直在想如何将请求转发到服务器。
到目前为止,我已经研究了 sub-requests,但我尝试的代码 none(或从 ngx_http_addition_filter_module
等现有模块复制而来!)似乎有效。要么我陷入一个循环,其中 100+ sub-requests 被解雇,要么什么都没有发生。我一直在尝试使用的代码:
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;
}
请指教我做错了什么!
代理没有像您预期的那样工作...我也很惊讶!
URI 需要更改为与配置文件中的 location /...
相对应的字符串。然后 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
定义处理每个可能更容易。
我正在使用 nginx 作为反向代理,我一直在尝试编写一个 nginx 模块来处理传入的请求,如果它喜欢请求中存在的某些 HTTP headers,nginx 将允许到达受保护服务器的请求(在 nginx 代理之后)。现在,我已经成功地实现了 header 处理,但我一直在想如何将请求转发到服务器。
到目前为止,我已经研究了 sub-requests,但我尝试的代码 none(或从 ngx_http_addition_filter_module
等现有模块复制而来!)似乎有效。要么我陷入一个循环,其中 100+ sub-requests 被解雇,要么什么都没有发生。我一直在尝试使用的代码:
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;
}
请指教我做错了什么!
代理没有像您预期的那样工作...我也很惊讶!
URI 需要更改为与配置文件中的 location /...
相对应的字符串。然后 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
定义处理每个可能更容易。