Встроенные Lua-скрипты в Nginx расширяют возможности популярного Web сервера практически до бесконечности. При этом для Lua-скриптов у Nginx'а есть удобный интерфейс ngx для доступа к системным данным и функциям манипуляции запросом и ответом. Одна из популярных операций — это получение тела (POST) запроса, для чего используется функция:

local data = ngx.req.get_body_data()

# в переменной data будет лежать все тело запроса

Однако подобная инструкция перестанет работать, если размер запроса превысит буфер запроса. Его можно увеличить, однако это крайне не рекомендуется делать. Крупные запросы лучше сразу записывать в файл, как это и делает Nginx. В таком случае, для получения тела запроса в Lua нужно использовать ngx.req.get_body_file().

В результате, правильный код для получения тела запроса независимо от размера будет такой:

local data = ngx.req.get_body_data()
if ( data == nil ) then
	local handle = io.open(ngx.req.get_body_file(), "rb")
	data = handle:read("*all")
	handle:close()
end