doufengsui7449 2016-08-02 01:03
浏览 193
已采纳

如何在ngx_http_lua_module中传递给Nginx fastcgi_pass?

I need to pass an Nginx variable to my PHP 7.0 backend using the excellent library https://github.com/openresty/lua-nginx-module

I prefer to use content_by_lua_block instead of set_by_lua_block, because the documentation for the 'set' function states "This directive is designed to execute short, fast running code blocks as the Nginx event loop is blocked during code execution. Time consuming code sequences should therefore be avoided.". https://github.com/openresty/lua-nginx-module#set_by_lua

However, since the 'content_...' function is non-blocking, the following code does not return in time, and $hello is unset when passed to PHP:

location ~ \.php{
    set $hello '';

    content_by_lua_block {
        ngx.var.hello = "hello there.";
    }

    fastcgi_param HELLO $hello;
    include fastcgi_params;
    ...
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

The problem is, my Lua code has the potential to be "time consuming code sequences" if certain code paths are taken, using crypto for example.

The following Nginx location works just fine, but that's because set_by_lua_block() is a blocking function call:

location ~ \.php {
    set $hello '';

    set_by_lua_block $hello {
        return "hello there.";
    }

    fastcgi_param HELLO $hello;
    include fastcgi_params;
    ...
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

My question is, what is the best approach here? Is there a way to call the Nginx directive fastcgi_pass and related directives from within a content_by_lua_block() only after my variables have been set?

  • 写回答

1条回答 默认 最新

  • dtyqflrr775518 2016-08-03 11:10
    关注

    Yes, it's possible with ngx.location.capture. Write a separate location block, example:

        location /lua-subrequest-fastcgi {
            internal;   # this location block can only be seen by Nginx subrequests
    
            # Need to transform the %2F back into '/'.  Do this with set_unescape_uri()
            # Nginx appends '$arg_' to arguments passed to another location block.
            set_unescape_uri $r_uri $arg_r_uri;
            set_unescape_uri $r_hello $arg_hello;
    
            fastcgi_param HELLO $r_hello;
    
            try_files $r_uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_index index.php;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
    

    Which you can then call thusly:

        location ~ \.php {
            set $hello '';
    
            content_by_lua_block {
                ngx.var.hello = "hello, friend."
    
                -- Send the URI from here (index.php) through the args list to the subrequest location.
                -- Pass it from here because the URI in that location will change to "/lua-subrequest-fastcgi"
                local res = ngx.location.capture ("/lua-subrequest-fastcgi", {args = {hello = ngx.var.hello, r_uri = ngx.var.uri}})
    
                if res.status == ngx.HTTP_OK then
                    ngx.say(res.body)
                else
                    ngx.say(res.status)
                end
            }
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记