#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)
Change History (3)
by , 8 years ago
Attachment: | nginx-bug-1211.tar.gz added |
---|
comment:1 by , 8 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
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.
testcase