Nginx 配置文件服务器(包含 API 支持)

我网站的部分应用需要用到一些静态资源,比如字体、图片之类的,并且这些不好放到项目文件夹里,因为太大了,也不灵活,所以我就放到了自建网盘(KodExplorer)里,这样更新也方便。但是,文件索引需要单独维护,比如某个文件夹有一些图片,我需要在一个 json 文件里列出这些图片路径,然后客户端拿到 json 文件后就知道有哪些图片可以下载。这很麻烦,以至于很多时候我都不想更新文件。

最近,又有一些资源文件需要维护,我不得不考虑新的方案,最后想到了 Nginx 开启文件服务功能,这样更新文件的时候我只需要上传文件就可以了。为什么不考虑 oss 呢?因为 oss 要钱,并且我不知道 oss 支不支持客户端直接读取目录。不过无所谓了,反正 Nginx 足够了。

文件服务器

Nginx 开启文件列表服务很方便,和配置网站是一样的,只是 location 里部分配置不同。

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name xxx.xxx.xxx;
        charset utf-8;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/kod/data/path;

        # ssl 配置

        # 跨域设置
        set $cors "";
        if ($http_origin ~* "(xxx)$") {
           set $cors $http_origin;
        }

        location /
        {
            autoindex on;
            autoindex_localtime on;
            sendfile on;
            charset utf-8;
            add_header Access-Control-Allow-Origin $cors;
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
            add_header Cache-control private;
        }

        access_log  /home/wwwlogs/xxx.xxx.top.log;
    }

可以看到,相关配置基本就几行:

  • autoindex on;开启文件列表服务。
  • autoindex_localtime on;表示显示服务器实际时间,默认 off 显示的是 GMT 时间,此配置只有在 autoindex_format 为 html 时生效,而 autoindex_format 默认就是 html。
  • 还有个未列出的 autoindex_exact_size 配置,默认 off,即显示文件字节大小,设为 on 则显示近似的大小,比如 kb、mb 之类的。此项配置也是只有在 autoindex_format 为 html 时生效。
  • autoindex_format 除了 html 外,还支持 xml、json、jsonp。
  • sendfile 这一行是为了优化静态文件传输性能。

接下来的跨域设置这里用不到。本来我是准备客户端读取 nginx 列表网页然后解析内容的,但既然 autoindex_format 支持 json,那事情就很容易了。

提供 API 服务

有了 json 格式支持,我只需要再配置一个 location 专门做 API 服务就好了,原来的那个 html 版本我还留着,需要看文件列表的时候网页更方便。

location /json
{
    alias /home/wwwroot/kod/path;
    autoindex on;
    autoindex_localtime on;
    autoindex_format json;
    sendfile on;
    charset utf-8;
    add_header Access-Control-Allow-Origin $cors;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Cache-control private;
}

上面是 API 服务的配置,当访问 json 路径的时候,访问 alias 指定目录。可以看到,这里的目录其实就是原来的目录。而跨域部分则只允许特定网站访问。

好了,现在我可以通过自建的网盘更新文件,通过 Nginx 的文件服务读取文件。如果以后需要文件排序之类的功能,可以直接在文件名上做一些标记,客户端解析标记排序就好。

Simple is good.