Opened 16 months ago

Closed 16 months ago

Last modified 16 months ago

#1359 closed defect (invalid)

Map command map $upstream_http_cache_control $bypass_cache_control ignored with proxy_cache_bypass $bypass_cache_control

Reported by: chazerbazer@… Owned by:
Priority: minor Milestone:
Component: nginx-module Version: 1.13.x
Keywords: map, proxy_cache_bypass Cc: Neil.Craig@…, Paul.Merry@…
uname -a: Linux playpen02 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
nginx -V: nginx version: nginx/1.13.4 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/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='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

Description

We are using the following map directive:

   map $upstream_http_cache_control $bypass_cache_control {
     "max-age=60" 1;
      default       0;
  }

Within location block we have:

   location / {
---snip---
        proxy_cache_bypass $bypass_cache_control; 
---snip---
}

Like this our map command does is not remapping. From a client we see:

$ curl --head http://playpen02/benula/Aldjia.jpg
HTTP/1.1 200 OK
Server: nginx/1.13.4
Date: Thu, 17 Aug 2017 15:42:44 GMT
Content-Type: image/jpeg
Content-Length: 0
Connection: keep-alive
Cache-Control: max-age=60
upstream_http_cache_control: :max-age=60:
Mapped_Cache-Control: 0
X-Proxy-Cache: HIT

If we remove proxy_cache_bypass $bypass_cache_control

   location / {
---snip---
       # proxy_cache_bypass $bypass_cache_control; 
---snip---
}

we now see our map statement working as expected;

$ curl --head http://playpen02/benula/Aldjia.jpg
HTTP/1.1 200 OK
Server: nginx/1.13.4
Date: Thu, 17 Aug 2017 15:44:47 GMT
Content-Type: image/jpeg
Content-Length: 0
Connection: keep-alive
Cache-Control: max-age=60
upstream_http_cache_control: :max-age=60:
Mapped_Cache-Control: 1
X-Proxy-Cache: EXPIRED

Why are we seeing the difference in behaviour when the inclusion of the proxy_cache_bypass directive?

Attachments (1)

nginx_map_with_proxy_bypass_behaviour (8.2 KB) - added by chazerbazer@… 16 months ago.
nginx -V output. Also expected and actual curl output.

Download all attachments as: .zip

Change History (3)

Changed 16 months ago by chazerbazer@…

nginx -V output. Also expected and actual curl output.

comment:1 Changed 16 months ago by mdounin

  • Resolution set to invalid
  • Status changed from new to closed

The proxy_cache_bypass directive determines if the cache will be used to serve a particular request. Obviously this happens before nginx contacts an upstream server, and hence before the $upstream_http_cache_control variable becomes available. As such, the map will be evaluated with an empty source value, and the result will be 0, and this result will be cached for further request processing. If you don't want nginx to cache the result, consider using the volatile parameter in the map. On the other hand, from the above explanation it should be clear that the configuration you are using simply does not make sense.

comment:2 Changed 16 months ago by chazerbazer@…

Understood. Thanks for the reply.

Note: See TracTickets for help on using tickets.