Nginx

发布于 更新于

AI总结: 本文介绍了一个使用Lua脚本在Nginx中捕获和记录请求与响应信息的实现,包含请求头、请求体、响应头和响应体的处理,且通过白名单机制限制日志记录的内容,以减少日志量。 优化建议: 1. 在配置中添加注释,详细说明每个部分的功能,以提高代码可读性。 2. 考虑将白名单的URI配置外部化,方便后续管理和更新。 3. 在捕获请求体时,增加对大文件的处理逻辑,以避免内存占用过高。 4. 对于日志记录,建议使用异步日志处理方式,以减少对请求处理的影响。 5. 定期清理或归档日志文件,防止日志文件过大影响性能。

可以将配置放到http, server, location下, 用于不同范围 需修改白名单whitelist, 只打印关心的接口, 防止日志太多

    # 初始化变量
    set $req_headers "";
    set $req_body "";
    set $resp_headers "";
    set $resp_body "";

    access_by_lua_block {
        -- 捕获请求头
        local headers = ngx.req.get_headers()
        local headers_str = ""
        for k, v in pairs(headers) do
            headers_str = headers_str .. "  " .. k .. ": " .. v .. "\n"
        end
        ngx.var.req_headers = headers_str

        -- 捕获请求体
        ngx.req.read_body()
        local body = ngx.req.get_body_data()
        if not body then
            local file = ngx.req.get_body_file()
            if file then
                local f = io.open(file, "rb")
                body = f:read("*all")
                f:close()
            end
        end
        ngx.var.req_body = body or "-"
    }

    body_filter_by_lua_block {
        local chunk = ngx.arg[1]
        if chunk then
            ngx.var.resp_body = (ngx.var.resp_body or "") .. chunk
        end
    }

    log_by_lua_block {
        -- 定义白名单 URI
        local whitelist = {
            ["/translate"] = true,
            ["/test2"] = true
        }
        -- 获取当前请求的 URI
        local uri = ngx.var.uri
        -- 检查是否在白名单中
        if whitelist[uri] then
            local resp_headers = ngx.resp.get_headers()
            local headers_str = ""
            for k, v in pairs(resp_headers) do
                headers_str = headers_str .. "  " .. k .. ": " .. v .. "\n"
            end
            ngx.var.resp_headers = headers_str

            local log_entry = string.format(
                "\nRequest: %s\nHeaders: \n%sBody: %s\n\nResponse Status: %s\nHeaders: \n%sBody: %s\n",
                ngx.var.request,
                ngx.var.req_headers,
                ngx.var.req_body,
                ngx.var.status,
                ngx.var.resp_headers,
                ngx.var.resp_body or "-"
            )

            ngx.log(ngx.INFO, log_entry)
        else
            ngx.log(ngx.INFO, uri)
        end
    }