nginx openresty升级后,之前写的ngx.location.capture不支持http2.0
ngx.location.capture 不支持http2
前段时间,我们升级了nginx后,发现原来的http2.0 不支持了,只能暂时降为http1.1。原因是后端同学写的用于验证接口权限的转发使用了ngx.location.capture,然后升级后的ngx.location.capture 还不支持http2。
lua entry thread aborted: runtime error: access_by_lua(nginx.conf:1167):3: http2 requests not supported yet
查了官方仓库的issues 发现是确实存在的问题,也不好处理
lua-nginx-module/src/ngx_http_lua_subrequest.c
Lines 173 to 177 in f6b486b
c#if (NGX_HTTP_V2) if (r->main->stream) { return luaL_error(L, "http2 requests not supported yet"); } #endif
只能放弃使用ngx.location.capture,改为使用lua-resty-http
如何使用lua-resty-http
安装lua-resty-http
我们是编译安装的nginx,也没使用什么luarocks之类的,刚开始还琢磨着如何安装呢,看文档也没有,最后找了找发现直接使用nginx的配置引入lua脚本就行。
先把lua-resty-http的包下载到对应目录,然后在nginx配置文件里面配置lua_package_path,位置在http { }里面,相当于把这个目录下所有的lua文件引入,设置lua代码的寻找目录,lua引入模块的时候会去寻找对应的目录,这个配置的话会增加这个寻找目录。
lua_package_path "/usr/local/lib/lua-resty-http-0.17.0/lib/resty/?.lua;;";
也可以换个自定义的目录,需要把lua-resty-http-0.17.0/lib/resty里面的几个lua文件拷贝过去。
#使用lua-resty-http
然后就开始修改原来location里面配置的ngx.location.capture
location ~*\/aaa/ {
access_by_lua '
local transfer_request_query = ngx.req.get_uri_args()
local res = ngx.location.capture("/auth", { args = transfer_request_query })
';
# 省略 *****
}
location ~*\/aaa/ {
#resolver 127.0.0.1; #8.8.8.8;
access_by_lua '
local aaa_transpond = require("aaa_transpond")
aaa_transpond(ngx.var.scheme, ngx.var.host, ngx.var.server_protocol, "/auth" )
--省略 *****
';
# 省略 *****
}
https://blog.csdn.net/panguangyuu/article/details/88892330
日志等级https://blog.csdn.net/u012618915/article/details/81301258
Nginx return语句,注意别漏了; https://blog.csdn.net/weixin_39218464/article/details/121184473
Nginx location优先级