問題描述
我們希望在日志中記錄 HTTP 請求頭信息,以查看請求信息、進行請求調試等等。
該筆記將記錄:在 Nginx 中,如何在日志中記錄 HTTP 請求頭信息。
解決方案
簡單說:目前(01/11/2021),沒有直接的方案(變量),需要變通處理。
方案一、枚舉變量
我們自定義日志格式,並在日志中打印這些變量。如下示例,輸出部分與客戶端網絡地址有關的變量:
log_format client_ip_address '[$time_local] Host="$http_host", ' 'Forwarded="$http_forwarded", ' 'X-Forwarded-For="$http_x_forwarded_for", ' 'X-Forwarded-Host="$http_x_forwarded_host", ' 'X-Forwarded-Proto="$http_x_forwarded_proto", ' 'X-REAL-IP="$http_x_real_ip", ' 'realip_remote_addr="$realip_remote_addr", ' 'remote_addr="$remote_addr", ' 'server_addr="$server_addr", ' 'upstream_addr="$upstream_addr", ' ; server { ... access_log /var/log/nginx/client-ip-address.log client_ip_address; ... }
方案二、使用 Lua 模塊
1)安裝 lua-nginx-module 模塊:
# Debian GNU/Linux 10 (buster) apt-get install libnginx-mod-http-lua # 通常開箱即用,無需使用 load_module /path/to/module.so 引入模塊
2)使用如下代碼進行頭部記錄:
# 該示例,將頭部信息寫入日志 header_filter_by_lua_block { local h = ngx.req.get_headers() for k, v in pairs(h) do ngx.log(ngx.ERR, "Got header "..k..": "..v..";") end } # 該示例,將直接返回請求頭 location /request_headers { default_type 'text/plain'; # 或者寫在變量中,然后進行引用 set_by_lua $request_headers ' local h = ngx.req.get_headers() local request_headers_all = "" for k, v in pairs(h) do request_headers_all = request_headers_all .. ""..k..": "..v..";\\n" end return request_headers_all'; return 200 $request_headers; }
注意事項,我們沒有展開深入說明,只提供思路(並驗證有效)。
參考文獻
WikiNotes/記錄 HTTP 請求頭到日志
logging - How to log all headers in nginx? - Stack Overflow
openresty/lua-nginx-module: Embed the Power of Lua into NGINX HTTP servers