proxy_cache_background_update ignores regular expression match when updating
Richard Stanway
r1ch+nginx at teamliquid.net
Tue Dec 4 17:57:15 UTC 2018
Hello,
I'm running into an issue where a proxied location with a regular
expression match does not correctly update the cache when using
proxy_cache_background_update. The update request to the backend seems
to be missing the captured parameters from the regex. I've created a
small test case that demonstrates this in nginx 1.15.7. Hopefully I'm
not missing anything, I checked the docs and didn't seem to find
anything that would explain this behavior.
nginx version: nginx/1.15.7
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
built with OpenSSL 1.1.0f 25 May 2017 (running with OpenSSL 1.1.0j
20 Nov 2018)
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-compat --with-file-aio --with-threads
--with-http_addition_module --with-http_auth_request_module
--with-http_dav_module --with-http_flv_module
--with-http_gunzip_module --with-http_gzip_static_module
--with-http_mp4_module --with-http_random_index_module
--with-http_realip_module --with-http_secure_link_module
--with-http_slice_module --with-http_ssl_module
--with-http_stub_status_module --with-http_sub_module
--with-http_v2_module --with-mail --with-mail_ssl_module --with-stream
--with-stream_realip_module --with-stream_ssl_module
--with-stream_ssl_preread_module --with-cc-opt='-g -O2
-fdebug-prefix-map=/data/builder/debuild/nginx-1.15.7/debian/debuild-base/nginx-1.15.7=.
-specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong
-Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC'
--with-ld-opt='-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro
-Wl,-z,now -Wl,--as-needed -pie'
Configuration:
proxy_cache_path /tmp keys_zone=test:1m max_size=1g inactive=1h
use_temp_path=off;
server {
listen 127.0.0.1:8010;
root /tmp/nginx;
}
server {
listen 127.0.0.1:8011;
location ~ /test/(regular|expression)$ {
proxy_pass http://127.0.0.1:8010/test/$1;
proxy_cache test;
proxy_cache_background_update on;
proxy_cache_use_stale updating;
proxy_cache_valid 10s;
}
}
Initial testing with proxy_cache_background_update off. Log excerpts
show requests to both servers.
First request (one to frontend, one to backend as expected):
127.0.0.1 - - [04/Dec/2018:17:42:31 +0000] "GET /test/regular
HTTP/1.0" 200 8 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:42:31 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
Second request (served from frontend cache, all good):
127.0.0.1 - - [04/Dec/2018:17:42:35 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
Third request (cache expired, so a new request to backend, also good):
127.0.0.1 - - [04/Dec/2018:17:43:14 +0000] "GET /test/regular
HTTP/1.0" 200 8 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:43:14 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
After setting proxy_cache_background_update on, every request tries to
do a background update with the wrong URL once the content is expired.
The stale content is still served in the meantime.
127.0.0.1 - - [04/Dec/2018:17:44:01 +0000] "GET /test/ HTTP/1.0" 403
153 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:01 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:15 +0000] "GET /test/ HTTP/1.0" 403
153 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:15 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:17 +0000] "GET /test/ HTTP/1.0" 403
153 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:17 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:19 +0000] "GET /test/ HTTP/1.0" 403
153 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:19 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:21 +0000] "GET /test/ HTTP/1.0" 403
153 "-" "curl/7.52.1" "-"
127.0.0.1 - - [04/Dec/2018:17:44:21 +0000] "GET /test/regular
HTTP/1.1" 200 8 "-" "curl/7.52.1" "-"
Is this a bug or am I misunderstanding how this is supposed to work?
More information about the nginx
mailing list