openresty/lua-nginx-module

Connection leak in ngx.location.capture()

開放

#1,857 建立於 2021年2月24日

 (4 則留言) (2 個反應) (0 位負責人)C (2,038 個分叉)batch import
good first issue

倉庫指標

星標
 (11,407 顆星)
PR 合併指標
 (平均合併 5天 4小時) (30 天內合併 6 個 PR)

描述

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.

貢獻者指南