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.