Opened 3 years ago

Closed 3 years ago

#1249 closed defect (fixed)

Blocking STALE requests using proxy_cache_background_update on Docker

Reported by: rdngr@… Owned by:
Priority: minor Milestone:
Component: nginx-core Version: 1.11.x
Keywords: Cc:
uname -a: Linux 4a7e76772df1 4.10.8-1-ARCH #1 SMP PREEMPT Fri Mar 31 16:50:19 CEST 2017 x86_64 Linux
nginx -V: nginx version: nginx/1.11.13
built by gcc 6.2.1 20160822 (Alpine 6.2.1)
built with OpenSSL 1.0.2k 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-compat --with-file-aio --with-http_v2_module --with-debug

Description

When running nginx within a Docker container operating in bridged networking mode the proxy_cache_background_update feature does not always work as intended. Certain requests, particularly requests with large response bodies, will cause nginx to wait for the server to reply with a new version instead of immediately sending the cached resource.

All requests where background updates become blocking log the following:

2017/04/14 08:13:46 [debug] 7#7: *3 writev() not ready (11: Resource temporarily unavailable)

Switching the Docker container to host networking mode seems to completely resolve the issue.

The issue has been replicated on three different machines (two physical running Arch Linux and one virtual running CentOS 7), with three different Docker versions: 1.12.6, 17.03.0, and 17.04.0.

The behavior is identical on both Ubuntu and Alpine base Docker images.

Scripts and configuration for reproducing the issue are available at https://github.com/rdngr/nginx-background-issue

Attachments (1)

bgsub (6.2 KB ) - added by Roman Arutyunyan 3 years ago.

Download all attachments as: .zip

Change History (5)

comment:1 by Roman Arutyunyan, 3 years ago

This looks like a known issue.
Can you try the patch and report if it fixes the problem?

by Roman Arutyunyan, 3 years ago

Attachment: bgsub added

comment:2 by rdngr@…, 3 years ago

The patch solved the issue perfectly. Thank you!

Will the patch be merged into the mainline branch in the near future?

comment:4 by Roman Arutyunyan, 3 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.