Je cherchais une réponse à cette question, et j'ai trouvé ceci : https://tarunlalwani.com/post/request-capturing-nginx-lua/
En gros, il utilise un script lua script pour rassembler et enregistrer tous les en-têtes :
ngx.log(ngx.ERR, "REQUEST capturing started")
json = require("json")
function getval(v, def)
if v == nil then
return def
end
return v
end
local data = {request={}, response={}}
local req = data["request"]
local resp = data["response"]
req["host"] = ngx.var.host
req["uri"] = ngx.var.uri
req["headers"] = ngx.req.get_headers()
req["time"] = ngx.req.start_time()
req["method"] = ngx.req.get_method()
req["get_args"] = ngx.req.get_uri_args()
req["post_args"] = ngx.req.get_post_args()
req["body"] = ngx.var.request_body
content_type = getval(ngx.var.CONTENT_TYPE, "")
resp["headers"] = ngx.resp.get_headers()
resp["status"] = ngx.status
resp["duration"] = ngx.var.upstream_response_time
resp["time"] = ngx.now()
resp["body"] = ngx.var.response_body
ngx.log(ngx.CRIT, json.encode(data));
Puis, faites-y référence à partir de la configuration de nginx :
location / {
proxy_pass http://127.0.0.1:8081/;
log_by_lua_file lua/request_logger.lua;
}
Pour recueillir le corps, un bloc est nécessaire dans nginx main.conf :
#we must declare variables first, we cannot create vars in lua
set $response_body '';
body_filter_by_lua_block {
-- arg[1] contains a chunk of response content
local resp_body = string.sub(ngx.arg[1], 1, 1000)
ngx.ctx.buffered = string.sub((ngx.ctx.buffered or "") .. resp_body, 1, 1000)
-- arg[2] is true if this is the last chunk
if ngx.arg[2] then
ngx.var.response_body = ngx.ctx.buffered
end
}
Le post dont le lien figure ci-dessus détaille beaucoup mieux cette question.
2 votes
mitmproxy en mode proxy inverse devrait faire ce que vous cherchez.
2 votes
@VivekThomas c'est une question de nginx.... nous utilisons déjà nginx et n'allons pas changer.
3 votes
@samsmith Vieille question, mais peut-être que cela aidera quelqu'un d'autre : vous ne doivent abandonner nginx. Selon les circonstances, vous pouvez simplement réacheminer temporairement nginx vers un autre port, afin de permettre à mitmproxy d'intercepter le trafic et de prendre en charge le débogage. Ensuite, une fois le débogage terminé, vous pouvez simplement rediriger nginx vers le port d'origine et arrêter mitmproxy.
2 votes
Vous pouvez utiliser le module modsecurity, qui peut enregistrer toutes les demandes/réponses, voir nginx.com/blog/modsecurity-logging-and-debugging