nginx: хранение данных POST в PostgreSQL - PullRequest
0 голосов
/ 27 марта 2019

Сервер nginx предоставляет простой интерфейс REST, используя экземпляр PostgreSQL в качестве бэкэнда. Nginx должен вставить данные POST (уже в формате JSON) в таблицу базы данных. К сожалению, $request_body, содержащий данные POST, заполняется nginx только в fastcgi_pass, proxy_pass,…

ngx_form_input тоже не помогает, так как ожидает данные POST в формате ключ-значение. Я попытался ngx_echo , но это приводит к внутренней ошибке сервера:

location ~ "^/api/v1/dummy/$" {
    auth_basic              "Restricted";
    auth_basic_user_file    /usr/local/etc/nginx/.htpasswd;

    if ($request_method != POST) {
        return 405;
    }

    client_max_body_size    100k;
    client_body_buffer_size 100k;

    echo_read_request_body;

    postgres_pass       postgresql;
    postgres_escape     $json =$request_body;

    postgres_query      POST "INSERT INTO mytable (data) VALUES ('$json')";
    postgres_rewrite    POST changes    201;
    postgres_rewrite    POST no_changes 204;
}

Кажется, что ngx_echo не работает вместе с ngx_postgres. Существуют ли другие способы получения данных тела запроса?

1 Ответ

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

Директивы echo_read_request_body и postgres_pass работают в фазе содержимого. В этом случае будет работать только один модуль.

Проблема здесь в том, что nginx асинхронен по своей природе. Nginx может инициировать восходящее соединение до получения полного тела запроса.

Используя OpenResty, вы можете заставить nginx прочитать все тело запроса: lua_need_request_body . Позаботьтесь о client_body_buffer_size и client_max_body_size. Включить пустой rewrite_by_lua*.

Другое возможное решение - написать код Lua, например, в set_by_lua_block и прочитать полное тело запроса, помните, что он может быть помещен в файл, используйте ngx.req.get_body_file для проверь это.

...