如果想要在nginx中打印出 http request 的所有 header,需要在编译nginx时开启
1、安装编译所需的依赖
apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
2、创建下载路径
mkdir -p /opt/download
3、下载所需的文件
# 不要下载官网http://luajit.org/download/的,要去下载openresty的优化版本 后面会说出现的坑
luajit: wget --no-check-certificate https://github.com/openresty/luajit2/archive/refs/tags/v2.1-20210510.tar.gz
lua-nginx-module: wget --no-check-certificate https://github.com/openresty/lua-nginx-module/archive/refs/tags/v0.10.20.tar.gz
lua-resty-core: wget --no-check-certificate https://github.com/openresty/lua-resty-core/archive/refs/tags/v0.1.22.tar.gz
lua-resty-lrucache: wget --no-check-certificate https://github.com/openresty/lua-resty-lrucache/archive/refs/tags/v0.11.tar.gz
tengine-2.3.2(nginx-1.17.3): wget --no-check-certificate http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
ngx_devel_kit-0.3.1: wget --no-check-certificate https://github.com/vision5/ngx_devel_kit/archive/refs/tags/v0.3.1.tar.gz
openssl-1.1.1f: wget --no-check-certificate https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz
解压所有文件
ls *.tar.gz | xargs -n1 tar xzvf
安装并添加luajit环境变量
cd luajit2-2.1-20210510
make install PREFIX=/usr/local/LuaJIT
# 编辑环境便利文件
vim /etc/profile.d/lua.sh
export LUAJIT_LIB=/usr/local/LuaJIT/lib
export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.1
# 引用环境变量
source /etc/profile.d/lua.sh
安装lua_core
cd lua-resty-core-0.1.22
make install PREFIX=/usr/local/lua_core
cd ../lua-resty-lrucache-0.11
make install PREFIX=/usr/local/lua_core
编译安装 tengine(nginx)
cd tengine-2.3.2
./configure --prefix=/usr/local/nginx-1.17.3 --with-http_stub_status_module --with-http_gzip_static_module --with-select_module --with-poll_module --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-stream --with-openssl=/opt/download/openssl-1.1.1f --add-module=/opt/download/lua-nginx-module-0.10.20 --add-module=/opt/download/ngx_devel_kit-0.3.1 --add-module=modules/ngx_http_upstream_check_module --add-module=modules/ngx_http_reqstat_module --add-module=modules/ngx_http_sysguard_module --add-module=modules/ngx_http_upstream_session_sticky_module --add-module=modules/ngx_http_user_agent_module --add-module=modules/ngx_slab_stat
make
make install
加载lua库,加入到ld.so.conf文件
cat /etc/ld.so.conf.d/libc.conf
/usr/local/lib
/usr/local/LuaJIT/lib
# 加载
ldconfig
配置并测试lua环境
添加在http模块下
# 指定lua模块路径,多个之间";"分隔,其中";;"表示默认搜索路径,默认到nginx的根目录下找
lua_package_path "/usr/local/Lua_core/lib/lua/?.lua;;";
#指定server配置文件目录
include /usr/local/nginx-1.17.3/conf/conf.d/*.conf;
#自定义日志格式
log_format test escape=json '{'
'"time": "$time_iso8601", '
'"server_name": "$host", '
'"port": "$server_port", '
'"method": "$request_method", '
'"args": "$args", '
'"uri": "$uri", '
'"server_protocol": "$server_protocol", '
'"status": "$status", '
'"body_bytes_sent": "$body_bytes_sent", '
'"upstream_addr": "$upstream_addr", '
'"upstream_status": "$upstream_status", '
'"upstream_response_time": "$upstream_response_time", '
'"req_header": "$req_header"'
'}';
测试域名配置文件
server {
listen 80;
server_name www.test.com;
access_log /var/log/nginx/www.test.com.access.log test;
set $req_header "";
header_filter_by_lua '
local h = ngx.req.get_headers()
for k, v in pairs(h) do
ngx.var.req_header = ngx.var.req_header .. k.."="..v.." "
end
';
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# requset by yanshul
proxy_intercept_errors on;
error_page 301 = @success;
proxy_pass http://172.17.64.32:31593;
}
location /lua {
set $test "hello,world";
content_by_lua '
ngx.header.content_type="text/plain"
ngx.say(ngx.var.test)';
}
}
启动nginx
/usr/local/nginx-1.17.3/sbin/nginx
curl 测试请求
curl 127.0.0.1/lua -H 'host: www.test.com' -H 'test: hjy'
日志
{"time": "2023-08-24T08:03:53+00:00", "server_name": "www.test.com", "port": "80", "method": "GET", "args": "", "uri": "/lua", "server_protocol": "HTTP/1.1", "status": "200", "body_bytes_sent": "22", "upstream_addr": "", "upstream_status": "", "upstream_response_time": "", "req_header": "test=hjy user-agent=curl/7.58.0 accept=*/* host=www.test.com "}
看到日志中 req_header 字段输出所有request header
坑1
让我们不要用这个luajit版本,可以用openresty提供的luajit优化版本,或者干脆直接用openresty。 卸载luajit官网版本,下载openresty提供的luajit优化版本
nginx: [alert] detected a LuaJIT version which is not OpenResty’s; many optimizations will be disabled and performance will be compromised (see https://github.com/openresty/luajit2 for OpenResty’s LuaJIT or, even better, consider using the OpenResty releases from https://openresty.org/en/download.html)
坑2
nginx: [alert] failed to load the ‘resty.core’ module (https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: module ‘resty.core’ not found:
no field package.preload[‘resty.core’]
no file ‘…/lua-resty-core/lib/resty/core.lua’
no file ‘…/lua-resty-lrucache/lib/resty/core.lua’
no file ‘./resty/core.lua’
no file ‘/usr/local/LuaJIT/share/luajit-2.0.5/resty/core.lua’
no file ‘/usr/local/share/lua/5.1/resty/core.lua’
no file ‘/usr/local/share/lua/5.1/resty/core/init.lua’
no file ‘/usr/local/LuaJIT/share/lua/5.1/resty/core.lua’
no file ‘/usr/local/LuaJIT/share/lua/5.1/resty/core/init.lua’
no file ‘./resty/core.so’
no file ‘/usr/local/lib/lua/5.1/resty/core.so’
no file ‘/usr/local/LuaJIT/lib/lua/5.1/resty/core.so’
no file ‘/usr/local/lib/lua/5.1/loadall.so’
no file ‘./resty.so’
no file ‘/usr/local/lib/lua/5.1/resty.so’
no file ‘/usr/local/LuaJIT/lib/lua/5.1/resty.so’
no file ‘/usr/local/lib/lua/5.1/loadall.so’) in /etc/nginx/nginx.conf:117
网上查找的结果是说
这个问题到git上面看了 ,https://github.com/openresty/lua-nginx-module/issues/1509
就是在nginx.conf 中的 http{}模块中加入下面这行代码:lua_load_resty_core off;但是检查的时候发现这命令已经废弃