Написание модуля Nginx: как переслать запрос на сервер? - PullRequest
1 голос
/ 18 марта 2019

Я использую 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 Ответ

1 голос
/ 27 марта 2019

Прокси-сервер работает не так, как вы ожидаете ... Я тоже был удивлен!

Необходимо изменить 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.

...