Opened 4 years ago

Closed 4 years ago

Last modified 3 years ago

#1211 closed defect (duplicate)

nginx doesn't forward response body to client when scgi backend doesn't read all input

Reported by: Joern Heissler Owned by:
Priority: minor Milestone:
Component: nginx-core Version: 1.10.x
Keywords: scgi Cc:
uname -a: Linux joerntop 4.9.0-1-amd64 #1 SMP Debian 4.9.2-2 (2017-01-12) x86_64 GNU/Linux
nginx -V: nginx version: nginx/1.10.3
built with OpenSSL 1.1.0d 26 Jan 2017 (running with OpenSSL 1.1.0c 10 Nov 2016)
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-F3HeH5/nginx-1.10.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-F3HeH5/nginx-1.10.3/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-F3HeH5/nginx-1.10.3/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-F3HeH5/nginx-1.10.3/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-F3HeH5/nginx-1.10.3/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-F3HeH5/nginx-1.10.3/debian/modules/ngx_http_substitutions_filter_module

Description

I wrote a backend application with SCGI connection.
My client tries to POST a huge body, but my application doesn't like it.
It only reads part of the request, determines that it's too large, sends an error response and closes the connection. Nginx (according to strace) receives the full response.

The client receives the http response header, but the body (which according to the headers is Chunked) is completely missing. nginx just closes the connection.

Same behaviour on Debian/Sid with debian's nginx version, and Ubuntu Xenial with nginx' package from https://nginx.org/en/linux_packages.html

Attachments (1)

nginx-bug-1211.tar.gz (1.4 KB ) - added by Joern Heissler 4 years ago.
testcase

Download all attachments as: .zip

Change History (3)

by Joern Heissler, 4 years ago

Attachment: nginx-bug-1211.tar.gz added

testcase

comment:1 by Maxim Dounin, 4 years ago

Resolution: duplicate
Status: newclosed

Looks like duplicate of #1037.

There is a bug in the backend server which makes it impossible to reliably receive the body of the response. To make it possible for nginx to receive the body, backend must either read the whole body, or implement proper connection teardown (in nginx, this is called lingering_close). See detailed explanation in ticket #1037 comments.

Some specific cases when nginx has enough information to send the response despite of the backend's bug were fixed as part of that ticket, the fix is available in nginx 1.11.4+. Note though that it only improves the chance of getting a correct response, but not fixes the root cause, and the problem will re-appear in slightly different conditions. To properly fix the problem you have to fix the backend.

comment:2 by Joern Heissler, 4 years ago

Thanks!

Note: See TracTickets for help on using tickets.