nginx 在后台更新过时的缓存条目时会忘记原始请求正则表达式变量

nginx 在后台更新过时的缓存条目时会忘记原始请求正则表达式变量

我在 nginx 代理后面运行地图图块服务器。图块计算非常昂贵,因此我将响应缓存 24 小时。我已将 nginx 配置为即使缓存已过期也会提供过时的响应,同时在后台更新缓存。

我的配置是这样的:

  location ~* ^/tiles/(streets|satellite-overlay)/(.*)$ {
    proxy_pass          http://127.0.0.1:5000/styles/$1/$2;

    # configure server-side cache
    proxy_cache         tiles;
    proxy_cache_valid   200 1d;
    proxy_buffering     on;

    # whilst tileserver recalculates the new tile, serve the old tile instead
    proxy_cache_background_update on;
    # only one request per tile
    proxy_cache_lock              on;
    proxy_cache_use_stale         error timeout invalid_header updating http_500 http_502 http_503 http_504;

    add_header          X-Cached $upstream_cache_status;
    # cache client-side for 24 hours
    add_header          "Cache-Control" "public, max-age=86400";
  }

因此,对 的请求/tiles/streets/1/2/3.png被正确代理到http://127.0.0.1:5000/styles/streets/1/2/3.png

然而,在 24 小时缓存期过后,当缓存应该在后台更新时,会从图块服务器请求以下 URL:http://127.0.0.1:5000/styles/streets//。这会导致 404 错误,并且缓存永远不会更新。

看起来$1$2变量的内容在某处丢失了。

有人能发现配置错误吗? 是否可以将这些变量与proxy_pass结合使用proxy_cache_background_update

答案1

在我看来,这似乎是 nginx 的一个错误。但是,作为一种可能的解决方法,您可以尝试使用命名捕获:

location ~* ^/tiles/(?<type>streets|satellite-overlay)/(?<tile>.*)$ {
    proxy_pass http://127.0.0.1:5000/styles/$type/$tile;
    ...
}

我记得有些时候我需要使用命名捕获,因为位置捕获不能正常工作。

但是,我没有遇到过类似的问题,所以我不确定这是否有帮助。

相关内容