zl程序教程

您现在的位置是:首页 >  其他

当前栏目

部署miniserve服务

2023-06-13 09:18:30 时间

背景

目前有大量的项目是通过 Github Release 进行应用分发的,比如 Powershell Core 和一些新兴的命令行工具(bat,tokei 等)。

不过在国内的服务器中通过 Github Release 下载文件的速度和稳定性通常得不到保障。这时候我一般会选择在 PC 上开代理将文件下载到本地,然后通过 FileZilla 工具将文件上传到服务器上。

FileZilla(sftp)工具实际上是进行了 ssh 连接,要求在本地机器上拥有 ssh 私钥,在非个人设备上难以做到。

其实在服务器上部署一个文件上传服务可以有效解决这个需求。

于是我在前段时间在服务器上部署了一个 miniserve 服务,用于处理类似的文件上传下载需求。

miniserve

miniserve 是一个通过 http 服务托管文件和目录的工具,使用 Rust 实现,拥有很多开箱即用的特性(web 页面,上传文件,下载目录(以 zip 或 tar.gz 格式打包),用户名密码认证等)。

部署 miniserve

启动 miniserve 服务

使用如下的命令启动 miniserve 服务。

miniserve -a $USER:$PASSWD -D -u -U -p $PORT -z -W --route-prefix=_files -t miniserve .

各个参数的含义分别为:

  • -a 设置访问用户名与密码
  • -D 将目录展示到文件之上
  • -u 允许上传文件
  • -U 允许创建子目录
  • -p 指定端口
  • -z 支持将整个目录通过 zip 下载
  • -W 在页面下方显示 wget 命令
  • –route-prefix 指定路径前缀
  • t 指定页面 title

启动服务后,可以通过localhost:$PORT访问 miniserve 的 web 页面。或者直接通过 wget 等工具直接进行文件上传或者下载。

配置 Nginx

不建议直接将 miniserve 服务直接通过 0.0.0.0 暴露到公网,毕竟上传或下载的文件总是会有一些私密性的,使用 https 是很有必要的。 miniserve 工具实际上是支持 tls 的,不过为一个单独的服务申请并配置证书总感觉有点浪费。 可以将 miniserve 服务通过配置了 https 的 nginx 进行端口转发。

server {
  server_name www.duyixian.cn;
  rewrite ^/(.*)$ https://www.duyixian.cn:443/$1 permanent;
}

server{
    listen 443;
    server_name www.duyixian.cn wx.duyixian.cn;
    ssl on;
    ssl_certificate /cert/www.duyixian.cn_bundle.crt;
    ssl_certificate_key /cert/www.duyixian.cn.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    error_page  404   /404.html;
    location /miniserve/ {proxy_pass http://127.0.0.1:8080/miniserve/; }
    location /dffd245af1 {proxy_pass http://127.0.0.1:8588; } # 处理css
}

一个小坑

miniserve 提供的网页引用了一个 css 文件,这个 css 实际上是内嵌在二进制文件里的,在每次运行的时候会随机生成一个名字。使用 nginx 转发 miniserve 服务的时候需要额外处理一下。

总结

miniserve 是一个相当实用的工具。除了作为文件服务器之外,还可以用来托管静态网站,甚至是单页应用(使用miniserve --spa --index index.html指定入口页面)。 也要感谢 rust 语言提供的开发效率提升和良好的生态,让广大的开发者可以使用 rust 改善传统的命令行工具。