我想创建一个服务来处理几十万个较小的文件(从 5kb 到 500kb,大部分在 10-100kb 左右)。可以把它想象成一种 gravatar.com,它在 URL 上提供这些小头像图片,例如https://secure.gravatar.com/avatar/1545f91437e2576b910dbd1023a44756
我想使用不带任何 ID 或哈希值的描述性 URL,例如http://www.server.com/This-is-my-file.ext,不存在重复的文件名。
什么是最有效的方法来提供和组织文件而又不需要太多的开销?
只需将所有内容放在一个目录中并让 nginx 提供文件服务,在达到一定数量的文件(取决于文件系统)之后,其速度就会变慢。
一个想法是将文件保存在基于文件名前几个字符的简单目录结构中,因此示例将从 T/h/This-is-my-file.ext 提供,并在 nginx 配置中使用简单的重写规则。这将导致不同目录中的分布非常不均匀。使用文件名的 md5 哈希值将产生良好的分布,但需要更多的计算能力……
我想这听起来像是键值存储的完美用例,但仅使用文件系统和 nginx 就不能保持简单吗?
答案1
对文件名进行哈希处理。
# 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;
}