如果从相同的域调用Nginxcaching失效只适用

我正在使用FRiCKLE的ngx_cache_purge模块来使代理caching失效。 我遇到了一个问题,无法清除caching时使用不同的主机部分访问失效的url比用于访问原始内容。 例如,如果我访问这样的内容:

curl -H 'Content-Type: application/json' -d '{ "token": "pts7v4nqf7stfq35qeb570v5n2" }' -X POST -D - http://api.example.com/news/article/cache-testing 

caching文件是用一个普遍的关键字创build的,它的工作原理是,随后的请求是正确的。 当内容发生变化时,为了清除caching的数据,后端在所有Web服务器上执行相同的操作:

 curl -D - http://10.200.100.101:8080/invalidate_cached_url/POST/news/article/cache-testing 

而这将返回404,因为caching文件是以某种方式生成的host部分的URL,为了清除它,我必须调用无效的URL在同一主机在线。 这是一个问题,因为我有一个webload的负载均衡器。

为了certificate这一点,我保存了上述方法生成的caching文件并清除了caching,然后直接用IP地址访问了api端点:

 curl -H 'Content-Type: application/json' -d '{ "token": "pts7v4nqf7stfq35qeb570v5n2" }' -X POST -D - http://10.200.100.101:8080/news/article/cache-testing 

现在当我尝试清除像上面的caching,它的工作原理。 而且足够真正的caching文件是不同的,但在二进制级别,但密钥是相同的。

有没有解决的办法?

这是我的configuration:

 proxy_cache_path /tmp/nginx/example-api levels=1:2 keys_zone=example_api_zone:300m inactive=1h; upstream origin_api { server localhost:8888; } server { listen 8080 default_server; server_name api.example.com; proxy_buffering on; proxy_buffer_size 1k; proxy_buffers 24 4k; proxy_busy_buffers_size 8k; proxy_max_temp_file_size 2048m; proxy_temp_file_write_size 32k; proxy_cache_key $request_method$uri; access_log /var/log/nginx/example-api.access.log; error_log /var/log/nginx/example-api.error.log; error_page 500 502 /502.html; location = /502.html { internal; root /opt/errors; } location / { gzip on; include example_proxy_params.conf; proxy_cache_bypass $http_cache_control; proxy_cache_methods POST GET; proxy_pass http://origin_api; } location ~ ^/news/singlearticle/ { gzip on; proxy_hide_header Cache-Control; add_header Cache-Control 'max-age=10s, no-cache ,public'; include example_proxy_params.conf; proxy_cache_bypass $http_cache_control; proxy_cache_methods POST GET; proxy_pass http://origin_api; } location ~ ^/news/subcategory/ { proxy_cache_key "$request_method$request_uri|$request_body"; include example_proxy_params.conf; proxy_cache_bypass $http_cache_control; proxy_cache_methods POST GET; proxy_pass http://origin_api; } location ~ /invalidate_cached_url/(.*) { allow 127.0.0.1; allow 10.200.100.101; allow 10.200.100.102; deny all; proxy_cache_purge example_api_zone $1; } } 

curl命令中设置主机名,例如:

 curl -H "Host: api.example.com" -D - http://192.168.255.230:8080/invalidate_cached_url/.... 

事实certificate,解决scheme是添加一个Origin头文件,因为nginx实际上使用它来创build散列文件,而且如果您仔细考虑它也是有道理的。 这从任何允许的IP成功:

 curl -H 'Origin: http://testing.bktvnews.com' -D - http://10.200.100.101:8080/invalidate_cached_url/POST/news/article/cache-testing