Hacking Limbo

Reading / Coding / Hacking

用 Nginx + WebDAV 实现简易对象存储

Nginx 的内置模块 ngx_http_dav_module 实现了 WebDAV 的 PUT / DELETE / MKCOL / COPY / MOVE 指令(其实有 PUT 就完全足够),稍微配置一下,就可以充当单机版的 Amazon S3.

应用写入数据只需依赖一个 WebDAV 客户端,比如 Python 的 EasyWebDAV 库或者集成了 Django Storage API 的 django-webdav-storage。至于读取,由于存储后端仍然是 POSIX 文件系统,不需要任何特殊处理,可以直接让 Nginx 响应请求,就跟普通的静态文件一样。

配置示例 (via django-webdav-storage):

server {
    listen 80;
    server_name webdav.example.com;

    root /data/media;

    client_max_body_size 10m;
    client_body_temp_path /tmp;
    create_full_put_path on;
    autoindex off;

    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_access user:rw group:r all:r;
}

优势:

  1. 依赖非常少
  2. 部署方便
  3. 客户端接入简单

局限:

  1. 没有高可用。
  2. 不支持 sharding(除非在客户端实现),容量有限。
  3. 找不到使用案例。

跨服务器的几种方案:

  1. 不跨 😓。所有文件写入到单台 WebDAV 服务器,读取也由同一台机器的 Nginx HTTP 处理(由前端机器 proxy_pass 过来)。
  2. 单台 WebDAV 服务器处理写入,NFS 挂载目录到前端机器提供读取。
  3. 进阶版:客户端处理 sharding,写入到 N 台 WebDAV 服务器,读取仍然靠 NFS.
  4. 进阶版 2: OpenResty 处理 sharding,写入到 N 台 WebDAV 服务器,读取还是靠 NFS.

有挺多花样可以玩,但是可靠性完全没法保证。这么山寨的实现,丢数据也不稀奇呢……