openresty/lua-nginx-module

Connection leak in ngx.location.capture()

Ouverte

#1 857 ouverte le 24 févr. 2021

 (4 commentaires) (2 réactions) (0 personne assignée)C (2 038 forks)batch import
good first issue

Métriques du dépôt

Stars
 (11 407 étoiles)
Métriques de merge PR
 (Merge moyen 5j 4h) (6 PRs mergées en 30 j)

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.

Guide contributeur