首页 > 系统相关 >nginx 记录完整的 request 及 response

nginx 记录完整的 request 及 response

时间:2024-12-15 12:55:04浏览次数:8  
标签:body headers ngx resp req request nginx local response

前言

在开发的过程中, 经常会有抓包的需求, 查看请求体和响应体. 使用 charles 等抓包工具会遇到一些麻烦, 如:

  1. localhost 请求无法捕获
  2. 有些工具配置代理比较麻烦, 如docker配置代理后需要重启
  3. https协议需要代理端配置证书进行解密, 比较麻烦

于是, 我就在想, 能否直接在服务端将所有的请求体和响应体打印出来, 不就完美解决这个问题了么?

一般来说, 通过nginx代理请求, 所有的请求都过nginx, nginx自身也有https的私钥, 会进行解密.

那么问题来了, 如何通过nginx打印请求呢?

中间探索的过程就不提了, 直接上结果.

lua打印

这里直接使用openresty/openresty镜像了, 当然如果直接使用nginx编译lua插件也是可以的.

在配置文件中添加如下lua脚本以打印完整请求内容:

# 将请求信息暂存, 放到最后一起打印
access_by_lua_block {
  ngx.req.read_body()
  local req_body = ngx.req.get_body_data()
  local req_uri = ngx.var.request_uri
  if req_body and #req_body > 1024 * 1024 then
    req_body = "Request too large"
  end
  if not req_body then
    req_body = "No request body"
  end
  local headers = ngx.req.get_headers()
  local header_str = ""
  for k, v in pairs(headers) do
    header_str = header_str .. string.format("%s: %s\n", k, v)
  end
  ngx.ctx.req_info = {
    uri = req_uri,
    body = req_body,
    headers = header_str
  }
}

body_filter_by_lua_block {
  local resp_body = ngx.arg[1]
  local req_info = ngx.ctx.req_info or {}
  local req_uri = req_info.uri or "Unknown URI"
  local req_body = req_info.body or "Unknown Request Body"
  local req_headers = req_info.headers or "Unknown Headers"
  local resp_headers = ngx.resp.get_headers()
  local resp_header_str = ""
  for k, v in pairs(resp_headers) do
    resp_header_str = resp_header_str .. string.format("%s: %s\n", k, v)
  end
  ngx.log(ngx.ERR, string.format(
      "Request URI: %s\nRequest Headers:\n%sRequest Body: %s\nResponse Headers:\n%sResponse Body: %s",
      req_uri,
      req_headers,
      req_body,
      resp_header_str,
      resp_body or "No response body"
    ))
}

这段逻辑在location中.

完整内容可参考: https://github.com/hujingnb/docker_composer/tree/master/openresty

简单记录一下, 以方便后续获取请求使用

标签:body,headers,ngx,resp,req,request,nginx,local,response
From: https://www.cnblogs.com/hujingnb/p/18607856

相关文章

  • 实现一个批量请求函数 multiRequest(urls, maxNum)
    在前端开发中,处理多个异步请求的一种常见需求是批量请求,并限制并发请求的数量以避免对服务器造成过大压力或浏览器资源耗尽。你可以使用Promise.all、Array.prototype.map和Array.prototype.reduce等方法来实现一个批量请求函数multiRequest,该函数接受一个URL数组和一个最......
  • 说说你理解的HTTP request 报文结构是怎样的?
    在前端开发中,HTTP请求报文是浏览器与服务器之间通信的基础。一个完整的HTTP请求报文通常由以下几个部分组成:请求行(RequestLine):请求方法(RequestMethod):常见的请求方法包括GET、POST、PUT、DELETE、PATCH等。GET方法通常用于请求数据,POST方法通常用于提交数据。请求U......
  • 说说你理解的HTTP response 报文结构是怎样的?
    在前端开发中,理解HTTP响应(HTTPResponse)报文的结构对于调试和优化网络请求至关重要。HTTP响应报文是由服务器在接收到客户端的HTTP请求后,返回给客户端的报文。一个HTTP响应报文通常由以下几个部分组成:状态行(StatusLine):HTTP版本:表示使用的HTTP协议版本,如HTTP/1.1。状态码(Sta......
  • Nginx的rewrite指令
    Nginx的rewrite指令​rewrite​指令在Nginx中用于对请求的URI进行重写操作,通过正则表达式来匹配和替换请求路径。这在需要调整请求路径或进行URL重定向时非常有用。以下是关于Nginxrewrite​指令的详细介绍:基本语法​rewrite​指令一般用于server​、location​或if​......
  • 用nginx正向代理,让内网主机通过外网主机访问外网
    需求1:某几个ip的代理server{listen9000;#监听端口server_namelocalhost;set$url"proxy_server_doman_or_ip";#设置代理的域名或IP变量,这里替换成自己需要代理的网站location/{proxy_passhttp:......
  • RequestContextHolder
    RequestContextHolder 是Spring框架中的一个工具类,它允许在没有显式传递请求对象的情况下,访问当前HTTP请求的上下文信息。它在一些需要访问当前请求但又不方便直接传递 HttpServletRequest 对象的场景中非常有用。基本概念RequestContextHolder 主要通过 ThreadLoca......
  • nginx 简介+应用
    文章目录nginx简介nginx二级目录处理二级目录实例列举1.第一个`location/`块2.第二个`location~^/(ui)`块3.第三个`location/api`块第一个`location/`与第二个`location~^/(ui)`是否重复nginx前端部署iframe嵌套配置设置后端服务转发实例......
  • Keepalived-Nginx实现高可用
    master机器配置文件:======================================================================!ConfigurationFileforkeepalived#全局配置global_defs{#路由ID,不能重复,通常为hostnamerouter_idmaster}#keepalived会定时执行脚本并对脚本执行的结果进行分析,动态......
  • docker搭建nginx-php环境
    首先,创建一个Dockerfile文件,内容如下:FROMphp:7.4-fpmRUNsed-i's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g'/etc/apt/sources.listRUNsed-i's/security.debian.org/mirrors.tuna.tsinghua.edu.cn/g'/etc/apt/sources.list#安装NginxRUNapt-ge......
  • An Active Inference Strategy for Prompting Reliable Responses from Large Languag
    本文是LLM系列文章,针对《AnActiveInferenceStrategyforPromptingReliableResponsesfromLargeLanguageModelsinMedicalPractice》的翻译。在医疗实践中促进大型语言模型做出可靠响应的主动推理策略摘要1引言2方式3方法4结果5讨论摘要人工......