2011-02-18 82 views
1

我正在开发一个应用程序,它需要在存​​储在服务器上的矢量图像的各种缩放级别下提供光栅图像文件。想象一下,将街道和建筑物的数据进行矢量化处理,然后根据客户对特定缩放级别和坐标的请求作出响应,然后生成类似谷歌地图的服务的PNG图块。用于高速缓存动态创建的图像文件的体系结构

在我的情况下,基础矢量数据的变化非常频繁,加上缩放级别比例如更接近增量。 Google地图中的十几个固定缩放步骤。因此,对我来说,预先计算所有可能的切片并将其上传到高性能静态媒体服务器是不切实际的。

有一种优雅的方式来获得的第一个请求对从产生它和所有后续请求从静止媒体服务器提供的应用程序来服务特定的瓷砖?

假设我一旦在应用程序服务器上生成一个图块,我就可以立即使其在静态介质服务器上可用。因为它将(a)加载具有许多不必要命中的应用服务器,并且(b)降低整体性能以降低整体的性能,所以如果之前已经生成了平铺,则使用重定向的明显方法是次优的。客户端,因为浏览器在获取图像数据之前需要发送两个串联请求,大约是响应时间的两倍。

所以我正在寻找其他的想法。例如。有没有办法配置一个Web服务器来尝试和使用高性能的静态文件服务,如果一个文件不存在,那么回到调用应用程序而不是返回404?

回答

1

这是生成文件缓存的相对常见的问题,如果它不存在,所以它可以直接由Web服务器提供。

在NginX中,有try_files选项。这需要一组URI,并且如您所期望的那样,尝试每个URI直到找到响应。如果第一组失败,但后面的一组返回OK并且数据(以及它在那里,还会创建一个与第一个尝试文件路径相匹配的文件),则下一个请求将被短路。

try_files $uri $uri/ /makeCacheFile.php?q=$uri&$args; 

在Apache中,这样的事情会执行许多与mod_rewrite的相同

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+)$ /makeCacheFile.php?q=$1 [L,QSA] 

在这里,我们检查,如果一个特定的文件中担任了一个请求,如果它不会,通过URL到可能继续生成它的脚本。