openresty/lua-nginx-module

Connection leak in ngx.location.capture()

Aberta

#1.857 aberto em 24 de fev. de 2021

 (4 comentários) (2 reações) (0 responsável)C (2.038 forks)batch import
good first issue

Métricas do repositório

Stars
 (11.407 estrelas)
Métricas de merge de PR
 (Mesclagem média 5d 4h) (6 fundiu PRs em 30d)

Description

The following settings lead to connections leak in nginx():

server {
  listen 8081;
  server_name  localhost;
  proxy_buffering on;
  proxy_buffers 8 128k;
  proxy_max_temp_file_size 0;
  location /a/ {
    content_by_lua_block {
      local data = ngx.location.capture('/b/')
      ngx.say("ok")
    }
  }
  location /b/ {
    proxy_pass http://127.0.0.1:8082/get/;
  }
  location /s/ {
    stub_status;
  }
}

If http://127.0.0.1:8082/get/ returned more than 1m (8 * 128k) of data then the upstream connection hangs. It still hangs even if the client connection breaks. You can easily see the leakage by configuring nginx with --with-http_stub_status_module option and by requesting http://127.0.0.1:8081/s/. Normal case (before requests):

Active connections: 1 
server accepts handled requests
 1 1 1 
Reading: 0 Writing: 1 Waiting: 0 

After 3 requests:

Active connections: 4 
server accepts handled requests
 5 5 5 
Reading: 0 Writing: 4 Waiting: 0 

You can setup a server for http://127.0.0.1:8082/get/ with the following configuration:

server {
  listen 8082;
  server_name  localhost;

  location /get/ {
    content_by_lua_block {
      ngx.say(string.rep(" ", 8*1024*1024))
    }
  }
}

Note that all works fine when proxy_buffering off; is set.

Guia do colaborador