openresty / openresty/lua-nginx-module

ngx.location.capture subrequest freeze in combination with NJS

Open
#2,390 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C
Stars
11.8k
Forks
2.1k
Avg merge
6h 1m
Merged PRs (30d)
6

Description

Hi,

I have following situation.

I have a nginx plus ingress controller running inside Kubernetes. Nginx exposes a service with a location:

server {
      listen 80;
      listen [::]:80;

      server_name luatest.com;
      error_log stderr debug;

      location /init {
        rewrite_by_lua_file /etc/nginx/lua/rewrite.lua;
      }
      include /etc/nginx/custom-conf/*.conf;
    }

The rewrite.lua script looks like this:

    ngx.log(ngx.INFO, "start lua process")
    local res_cookie = ngx.location.capture("/testlocation")
    ngx.say("I am ok") ngx.exit(200)
    ngx.log(ngx.INFO, "did subrequest")

The script sends a subrequest to following location:

    location /testlocation {
        internal;
        js_content request_handling.request_handling;
    } 

Further, the njs script does following:

    async function request_handling(r) {
      r.log("here in njs script");
      let test= await r.subrequest('/njs_target');
      r.log("did subrequest from njs to location");
      r.return(200, test);
      return;
    }
    export default {request_handling}

As soons as i do a curl request to the location /init the request stucks until i terminate the connection, or some timeout kicks in.
Inside the Nginx debug logs, i can see the last log lines from njs and the nginx line "http finalize request: 0, "/njs_target?" a:0, c:3" which should close everything and return back to LUA, but its not the case.
These are the last debug logs:

[info] 25#25: *3 js: here in njs script
[debug] 25#25: *3 posix_memalign: 00006166EFF0A4A0:4096 @16
[debug] 25#25: *3 http subrequest "/njs_target?"
[debug] 25#25: *3 http finalize request: -4, "/testlocation?" a:0, c:4
[debug] 25#25: *3 http request count:4 blk:0
[debug] 25#25: *3 http posted request: "/njs_target?"
[debug] 25#25: *3 rewrite phase: 1
[debug] 25#25: *3 test location: "/njs_target"
[debug] 25#25: *3 using configuration "/njs_target"
[debug] 25#25: *3 http cl:-1 max:1048576
[debug] 25#25: *3 rewrite phase: 3
[debug] 25#25: *3 http output filter "/njs_target?"
[debug] 25#25: *3 http copy filter: "/njs_target?"
[debug] 25#25: *3 http postpone filter "/njs_target?" 00007FFCA7882B40
[debug] 25#25: *3 http postpone filter in memory
[debug] 25#25: *3 http postpone filter in memory 7 bytes
[debug] 25#25: *3 http copy filter: 0 "/njs_target?"
[debug] 25#25: *3 http finalize request: 0, "/njs_target?" a:0, c:3
[info] 25#25: *3 js: did subrequest from njs to location
[debug] 25#25: *3 http output filter "/testlocation?"
[debug] 25#25: *3 http copy filter: "/testlocation?"
[debug] 25#25: *3 http copy filter: 0 "/testlocation?"
[debug] 25#25: *3 http request count:3 blk:0
[debug] 25#25: *3 delete posted event 00006166F0044560
[debug] 25#25: *3 http run request: "/init?"
[debug] 25#25: *3 rewrite phase: 4

If i terminate the curl command on the client side, these two lines show up in the nginx logs:

[debug] 26#26: *4 http run request: "/init?"
[debug] 26#26: *4 http reading blocked

If i remove the njs subrequest, it is working again, but from my side it seems LUA is waiting for something if i enable the NJS subrequest, but i cant figure out what it is.

Version overview of the test environment:

NJS: 0.8.5
LUA: 0.10.26
Nginx: nginx/1.25.5 (nginx-plus-r32-p1)

I also had the same behavior with the latest NJS Version 0.8.8 and NGINX plus r33.

One more thing to mention, everything is working with following version:

NJS: 0.7.11
LUA: 10.22
Nginx: nginx/1.23.2 (nginx-plus-r28)

Many thanks in advance.

Cheers

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with rewrite.lua, the request_handling njs entry point, and the /njs_target location, then reproduce the nested subrequest using the provided NGINX debug logs and version combinations. Done means a request to /init returns instead of hanging when the njs subrequest is enabled, while preserving the working behavior without it.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, lua, nginx
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.