Opened 8 years ago
Closed 8 years ago
#1136 closed defect (wontfix)
`ngx_stream_proxy_process_connection` does not terminate udp session correctly with param `proxy_responses`
Reported by: | Owned by: | ||
---|---|---|---|
Priority: | minor | Milestone: | |
Component: | nginx-module | Version: | 1.11.x |
Keywords: | stream udp proxy_responses | Cc: | |
uname -a: | Linux localhost.localdomain 3.10.0-327.36.3.el7.x86_64 #1 SMP Mon Oct 24 16:09:20 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux | ||
nginx -V: |
nginx version: openresty/1.11.2.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --prefix=/usr/nginx --with-debug --with-cc-opt='-DNGX_LUA_USE_ASSERT -DNGX_LUA_ABORT_AT_PANIC -O2' --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.60 --add-module=../xss-nginx-module-0.05 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.31 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.06 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.7 --add-module=../ngx_lua_upstream-0.06 --add-module=../headers-more-nginx-module-0.32 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.17 --add-module=../redis2-nginx-module-0.13 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.14 --add-module=../rds-csv-nginx-module-0.07 --with-ld-opt=-Wl,-rpath,/usr/luajit/lib --with-stream --with-http_ssl_module |
Description
I have a service which collects some statistics informations by udp protocol, only receive request and no response. So I use nginx as a loadbalancing in front of the service.
My nginx.conf :
stream { upstream hund { server 127.0.0.1:5000; server 127.0.0.1:5001; server 127.0.0.1:5002; } server { listen 4000 udp; proxy_timeout 0; proxy_responses 0; proxy_pass hund; } }
But the nginx mark the servers of upstream failed. The proxy_responses
means backend server has no response in doc. When I view the code of this issue, I find ngx_stream_proxy_process_connection
maybe not terminate udp session correctly.
In my opinion the code of ngx_stream_proxy_process_connection
if (s->connection->type == SOCK_DGRAM) { if (pscf->responses == NGX_MAX_INT32_VALUE) { /* * successfully terminate timed out UDP session * with unspecified number of responses */ pc->read->ready = 0; pc->read->eof = 1; ngx_stream_proxy_process(s, 1, 0); return; } if (u->received == 0) { ngx_stream_proxy_next_upstream(s); return; } }
shound be
if (s->connection->type == SOCK_DGRAM) { if (pscf->responses == 0 || pscf->responses == NGX_MAX_INT32_VALUE) { /* * successfully terminate timed out UDP session * with unspecified number of responses or no response */ pc->read->ready = 0; pc->read->eof = 1; ngx_stream_proxy_process(s, 1, 0); return; } if (u->received == 0) { ngx_stream_proxy_next_upstream(s); return; } }
Note:
See TracTickets
for help on using tickets.
What were you expecting by setting "proxy_timeout 0;" ?
In your case this timeout expires before udp session is finalized normally. This is why you have the error. Just remove this directive and it will work.
The code in ngx_stream_proxy_process_connection(), you have mentioned, is supposed to gracefully shut down a udp session when no proxy_responses is specified. Your case has nothing to do with that.