Skip to content
文章摘要

nginx openresty升级后,之前写的ngx.location.capture不支持http2.0

ngx.location.capture 不支持http2

前段时间,我们升级了nginx后,发现原来的http2.0 不支持了,只能暂时降为http1.1。原因是后端同学写的用于验证接口权限的转发使用了ngx.location.capture,然后升级后的ngx.location.capture 还不支持http2。

log
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

https://github.com/openresty/lua-nginx-module/issues/1195

只能放弃使用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引入模块的时候会去寻找对应的目录,这个配置的话会增加这个寻找目录。

nginx
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

lua
location ~*\/aaa/  {
  access_by_lua '
  local transfer_request_query = ngx.req.get_uri_args()
  local res = ngx.location.capture("/auth", { args = transfer_request_query })
  ';
  # 省略 *****
}
lua
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优先级