Nginx

发布于 更新于

AI总结: 本文介绍了在Nginx中使用Lua脚本捕获请求和响应的头部及体,并通过白名单机制控制日志输出,以减少日志量。代码中通过设置变量和使用不同的Lua块来实现请求和响应数据的捕获,同时根据URI判断是否记录详细日志。 优化建议: 1. 考虑将白名单配置提取到外部文件,以便于管理和扩展。 2. 使用更高效的字符串拼接方式,例如table.concat,以减少内存占用和提高性能。 3. 增加错误处理机制,确保在读取请求体或文件时出现问题时能够记录相应的错误日志。 4. 考虑使用ngx.shared.DICT来存储白名单,以提高查找效率。

可以将配置放到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
    }