我在 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;
...
}
我记得有些时候我需要使用命名捕获,因为位置捕获不能正常工作。
但是,我没有遇到过类似的问题,所以我不确定这是否有帮助。