вторник, 4 августа 2015 г.

nginx и обработка POST параметров

Есть набор переменных, $arg_* и массив $args, но туда попадают только переменные из строки запроса (прежде всего это будут GET запросы, но и у POST могут быть). А что делать, если надо обработать POST запросы? Зачем? Например, есть некий софт, который запрашивает файл через post, надо получить имя и отдать его с диска. Только ради этого писать обёртку на любом языке, которая требует ресурсов, обслуживания, обновлений, проверки что оно всегда работает итд? А если эта прослойка не успела ещё запуститься или просто упала, а файл уже запросили? Всего-то дел, получить имя из запроса...
Увы, штатного метода нет, но благодаря модулям со сторонними языками это реализуемо, правда пока найдено только 2 метода.

Lua

    location = /test {
        content_by_lua '
            ngx.req.read_body()
            local args, err = ngx.req.get_post_args()
            if not args then
                ngx.say("failed to get post args: ", err)
                return
            end
            for key, val in pairs(args) do
                if type(val) == "table" then
                    ngx.say(key, ": ", table.concat(val, ", "))
                else
                    ngx.say(key, ": ", val)
                end
            end
        ';
    }
http://wiki.nginx.org/HttpLuaModule#ngx.req.get_post_args
http://wiki.nginx.org/HttpLuaModule

Также есть set_by_lua и set_by_lua_file,
Пара замечаний про модуль.
This document describes ngx_lua v0.9.16 released on 22 June 2015.
Найти можно через http://wiki.nginx.org/3rdPartyModules
Штатно его нет, надо пересобирать nginx.

http://stackoverflow.com/questions/11066300/how-does-one-access-post-arguments-from-nginx-upload-module-in-embedded-lua-pe

Также можно посмотреть на openresty, который к тому же содержит большой комплект неблокирующих lua библиотек для работы.
http://habrahabr.ru/post/240217/

Perl
Читая куцую пародию на доки и статью от 2008 года Встроенному perl'у быть! становится очень грустно и печально от понимания, что если нет более вменяемых модулей, то придется использовать ЭТО. На дворе 2015, а тьма граблей и код в несколько экранов просто ради получения post параметров? Да проще свой модуль под это написать, чем делать ЭТО. А в штатном репозитории только перл модуль и есть.
Собственно, примеры выше. Ну или
http://snippets.aktagon.com/snippets/555-how-to-filter-post-parameters-with-nginx-and-the-perl-module

Спрашивается, чего авторам тот же Lua штатно не подключить? Модуль асинхронный, неблокирующий, вполне себе отлаженный, умеет много и хорошо, писать на нём быстрее чем на перле, используется китайцами давно и в хайлоаде... Хотя если оно включено в платную версию, то понятно.
Более того, у их форка от taobao оно активно по умолчанию
http://dragonflybsd.blogspot.ru/2015/08/tengine-nginx-taobao.html


Комментариев нет:

Отправить комментарий