Table of Contents
我网站的部分应用需要用到一些静态资源,比如字体、图片之类的,并且这些不好放到项目文件夹里,因为太大了,也不灵活,所以我就放到了自建网盘(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.