如何组织数百万个静态文件以通过网络高效地提供服务?

use*_*080 5 rewrite filesystems nginx hash

我想创建一个服务来提供数十万个较小的文件(从 5kb 到 500kb,大部分在 10-100kb 左右)。将其视为一种 gr​​avatar.com,它在https://secure.gravatar.com/avatar/1545f91437e2576b910dbd1023a44756等 URL 上提供这些小头像图片

我想使用没有任何 ID 或哈希值的描述性 URL,例如http://www.server.com/This-is-my-file.ext,没有重复的文件名。

在没有太多开销的情况下提供和组织文件的最有效方法是什么?

只要将所有内容放在一个目录中并让 nginx 提供文件,在达到一定数量的文件后,速度会变慢,具体取决于文件系统。

一个想法是根据文件名的第一个字符将文件保存在一个简单的目录结构中,因此该示例将从 T/h/This-is-my-file.ext 中提供,并在 nginx 配置中使用简单的重写规则。这将导致不同目录的分布非常不均匀。假设使用文件名的 md5 哈希值会产生良好的分布,但需要更多的计算能力...

我想这听起来像是键值存储的完美用例,但是仅仅使用文件系统和 nginx 来保持简单是不是可能?

moe*_*eye 2

对文件名进行哈希处理。

set_md5指令文档

# You can do this:
# I didn't test this. 
location /hashed/([0-9a-f]{2})([0-9a-f]*)/(.*) {
  try_files /$1/$2/$3;
}
set_md5 $digest $request_uri;
location / {
  rewrite .* /hashed/$digest/$request_uri;
}
Run Code Online (Sandbox Code Playgroud)