如何在 JVM (Clojure) 和 Nginx 中使用 Web 服务存储大量文件并限制对它们的访问?

How to store a lot of files and restrict access to them using web service in JVM (Clojure) and Nginx?

我有网络服务。我需要存储和检索文档(pdf、docx 等)。我使用 Ubuntu、Nginx 和 JVM 的最新稳定版本。 Clojure 是我的编程语言。据我所知,Nginx 可以很好地缓存文件系统数据。我想根据用户或其他 Web 服务规则允许访问某些文件并限制其他文件。例如,我可以允许访问一个文件,然后限制它一段时间,然后再次允许访问。

如何使用 Nginx 或不使用 Nginx?

P.S。我在没有 Nginx 的情况下看到这样的解决方案: 1. 我收到客户的请求。 2. 我选择我可以根据安全规则向客户端响应一个文件。 3. 如果允许访问,我将使用 RandomAccessFile(或另一个 IO class)和 return 字节直接从文件系统读取文件到客户端,而无需 Nginx。

或者我可以将所有文件存储在一个平面文件中(数 GB 或 TB),并将偏移量和元数据(id、文件名等)存储在第二个文件中。我可以将第二个文件存储在 RAM 中。随着数据量的增加没关系。但是它的阅读性能会好吗?我认为它有这样的优势,比如在任何文件系统上都具有非常好的写入性能。

一个简单的解决方案:

  1. 在 nginx-clojure (http://nginx-clojure.github.io) 上使用环处理程序,
  2. 对于下载文件服务:在ring handler中,可以返回一个File对象作为response body,访问控制可以在content handler中进行,也可以使用单独的access handler。
  3. 对于上传服务:简单使用HTTP PUT,不进行文件解码,否则使用形式post,需要使用wrap-multipart-params解码文件,如https://github.com/ring-clojure/ring/wiki/ File -上传。
  4. 上传文件后,存储的文件可以使用相对路径,例如根据文件的md5字符串,第1到第2个字符为目录名,第3到第4个字符为二级目录名,如23/ a3 / full-md5-as-file-name, 所以目录下的文件分布比较均衡