背景

Alist是一个开源的支持多种存储的文件列表程序(powered by Gin and Solidjs)。十分简洁优雅,同时功能又十分强大。

这是我配置好的Alist,可以看一下效果。

我的服务器上已经用Apache2监听80和443端口来提供WordPress服务给来自qiuyedx.com这个一级域名的访问了。Apache2已经配置了HTTP请求会自动跳转为HTTPS。443是HTTPS的端口,已经有了SSL证书(但只绑定了qiuyedx.com和www.qiuyedx.com)。下来咱就讲讲我是怎么一步步配置好的吧!小声:踩了一些坑:(

通过Docker使用Alist

安装docker

更新一下源

apt-get update

安装docker

apt install docker.io

docker开机自启

systemctl enable docker.service

docker常用命令

--启动docker
systemctl start docker
--停止dokcer
systemctl stop docker
--查看docker状态
systemctl status docker 
--重启docker
systemctl restart docker
--设置docker 开机自启
systemctl enable docker
--查看docker 版本
docker version
--查看docker 镜像
docker images
--查看docker 运行列表
docker ps 
--查看docker (运行、停止)
docker ps -aq
--删除容器
docker rm -f 容器ID/容器名称(CONTAINER ID/NAMES)
-- 删除多个容器(空格隔开)
docker rm -f 容器ID/容器名称 容器ID/容器名称 ...
--删除全部容器
docker rm -f $(docker ps -aq)

——————高频命令——————

--查看docker 
docker ps 
--进入容器
docker exec -it 容器ID/容器名称(CONTAINER ID/NAMES) /bin/bash
docker exec -it 容器ID/容器名称(CONTAINER ID/NAMES) bash
--例如
docker exec -it 56f0b18af626 /bin/bash
docker exec -it postgres10.7 bash 

————移除容器需要两步————
docker stop XXX
docker rm XXX

若容器一直卡在restarting,则说明配置文件出错或有其他bug。

--容器内拷贝文件到宿主机(拷贝出来)
--docker cp 容器ID/名称: 容器内文件存放路径  容器外文件存放路径
docker cp 56f0b18af626:/opt/ceshi.txt /opt/dockercpcehi/
ll /opt/dockercpcehi/

——————容器开机自启——————
docker ps -qa 
docker  update --restart=always 容器ID/容器名
docker  update --restart=always 56f0b18af626

————查看容器挂载目录————
--查询出容器ID或者名称 --(CONTAINER ID和NAMES)
 docker ps
 --docker inspect 容器ID/容器名称 | grep Mounts -A 20
 docker inspect 56f0b18af626 | grep Mounts -A 20
2023-03-28-17.40.35.png
查看容器挂载目录

启动Alist服务

先在服务器中创建目录/opt/alist/data

mkdir /opt/alist/data

然后pull最新的Alist镜像

docker pull xhofe/alist

运行容器

docker run -d --restart=always -v /opt/alist/data:/opt/alist/data -p 5244:5244 -e PUID=0 -e PGID=0 -e UMASK=022 --name="alist" xhofe/alist:latest

初始化Alist

docker exec -it alist ./alist admin

记录下终端中输出的用户名和密码

配置文件路径:/opt/alist/data/config.json

默认端口是5244,本地可通过localhost:5244访问

外网可通过外网IP:5244访问

如果你的域名解析的是你的服务器外网IP,则可以用域名:5244访问

配置文件

Alist的配置文件路径是/opt/alist/data/config.json

我的配置:(仅供参考)

{
  "force": false,
  "address": "0.0.0.0",
  "port": 5244,    /*可以自定义端口*/
  "site_url": "https://share.qiuyedx.com", /*设置为自己的Alist url*/
  "cdn": "",
  "jwt_secret": "b1arZA9HyL93ZADL",
  "token_expires_in": 48,    /*Token过期时间 默认48h*/
  "database": {
    "type": "sqlite3",
    "host": "",
    "port": 0,
    "user": "",
    "password": "",
    "name": "",
    "db_file": "data/data.db",
    "table_prefix": "x_",
    "ssl_mode": ""
  },
  "scheme": {    /*配置HTTPS*/
    "https": false,
    "cert_file": "data/public.crt",
    "key_file": "data/key.key"
  },
  "temp_dir": "data/temp",
  "bleve_dir": "data/bleve",
  "log": {
    "enable": true,
    "name": "data/log/log.log",
    "max_size": 10,
    "max_backups": 5,
    "max_age": 28,
    "compress": false
  },
  "max_connections": 0,
  "tls_insecure_skip_verify": true
}

比较令人困惑的是其中的"scheme"字段。

踩坑历程

一开始我在这里配置好SSL证书密钥文件(绑定的一级域名qiuyedx.com),并设置为true之后,会出现这样的情况:

  • http://qiuyedx.com:5244 被拒绝,因为试图用http协议访问https协议的服务
  • https://qiuyedx.com:5244 正常访问,显示为安全连接

但是我不想在URL中暴露端口,所以我试图用二级域名隐性解析到https://qiueydx.com:5244。但此时的效果如下:

  • http://share.qiuyedx.com 可以访问,但被标记为不安全的连接(原因是证书中的域名是qiueydx.com这个一级域名,而目前的URL是二级域名share.qiuyedx.com,不一致)
  • https://share.qiuyedx.com 一直加载不出来,进度条也不动,页面一直空白,甚至连DNS解析的过程都没有发生?

当我以为只需要把SSL证书换成绑定二级域名share.qiuyedx.com的就可以了,但是当我换好之后,情况是这样的:

  • http://share.qiuyedx.com 无法访问(具体什么样子有些记不清了)
  • https://share.qiuyedx.com 一直加载不出来,进度条也不动,页面一直空白

细心的同学会发现,域名解析如果设置为隐性(or显性)跳转的话,都是只有http可以跳转,https直接加载不动,进度条都不带动的。

问题总结

以上的问题总结下来就是:

我的服务器上有个监听5244端口的服务,我的一级域名是qiuyedx.com,二级域名是share.qiuyedx.com。一级域名已经监听了80和443端口,请问如何配置可以实现用https://share.qiuyedx.com访问5244端口的服务

相信已经有同学有解决问题的思路了。比如——反向代理

反向代理实现HTTPS+二级域名访问Alist服务

由于我的WordPress用的是Apache2,所以这里就不用Nginx演示了。

大致思路

不使用Alist自带的HTTPS配置,而是使用Apache2(or Nginx)监听二级域名的443端口并反向代理到我们的5244端口的服务。

开搞!

先将Alist自带的HTTPS配置还原,Alist这里走HTTP。

"scheme": {    /*配置HTTPS*/
    "https": false,  /*设置为false*/
    "cert_file": "data/public.crt",
    "key_file": "data/key.key"
  }

然后使用 Apache 作为反向代理服务器,使用 mod_proxy 模块和 mod_ssl 模块来配置 HTTPS 反向代理。

以下是一种可能的 Apache 配置示例,假设已经安装了 Apache 并且使用的是自签名证书:

Apache2 SSL 配置文件路径:/etc/apache2/sites-enabled/000-default-ssl.conf

<VirtualHost *:443>
    ServerName share.qiuyedx.com

    SSLEngine on
    SSLCertificateFile /path/.../public.crt
    SSLCertificateKeyFile /path/.../key.key

    ProxyPreserveHost On
    ProxyPass / https://localhost:5244/
    ProxyPassReverse / https://localhost:5244/
    ProxyRequests Off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
</VirtualHost>

上述配置中,我们监听了 HTTPS 的 443 端口,并配置了证书。这个证书和WordPress配置的是同一个证书,都绑定的是一级域名qiuyedx.com。ProxyPassProxyPassReverse 指令将请求转发给本地的 5244 端口。ProxyPreserveHost 指令用于保留原始请求中的主机头信息,ProxyRequests 指令用于禁用代理服务器的请求处理。

最后,我们定义了一个代理块 <Proxy *>,并在其中设置了允许所有的代理请求。这是必须的,因为 Apache 默认情况下不允许代理请求,需要显式地启用。

不过这里就又有问题了:

我已经监听443端口给qiuyedx.com这个一级域名了,难道不会发生冲突吗?

答案是:如果你已经在 Apache 中监听了 443 端口,并且为 qiuyedx.com 配置了 HTTPS,则需要使用 SNI(Server Name Indication)来指定应该使用哪个虚拟主机配置。可以使用以下配置来实现:

<VirtualHost *:443>
    ServerName qiuyedx.com
    # your existing HTTPS configuration for qiuyedx.com
    # ...

    SSLStrictSNIVHostCheck on
</VirtualHost>

<VirtualHost *:443>
    ServerName share.qiuyedx.com

    SSLEngine on
    SSLCertificateFile /path/.../cert.crt
    SSLCertificateKeyFile /path/.../key.key

    ProxyPreserveHost On
    ProxyPass / http://localhost:5244/
    ProxyPassReverse / https://localhost:5244/
    ProxyRequests Off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
</VirtualHost>

上述配置中,我们为 qiuyedx.comshare.qiuyedx.com 配置了两个虚拟主机,分别监听 443 端口。在 qiuyedx.com 的虚拟主机中,我们定义了你现有的 HTTPS 配置,可以根据你的实际配置进行修改。在 share.qiuyedx.com 的虚拟主机中,我们配置了 HTTPS 反向代理,和之前的示例配置一样。

SSLStrictSNIVHostCheck on 指令开启了 SNI 主机名检查。这可以确保客户端提供正确的主机名,以匹配正确的虚拟主机配置。这样就可以避免冲突问题。

当我们完成 Apache 配置后,需要重启 Apache 服务以使配置生效。可以使用以下命令重启 Apache 服务:

sudo service apache2 restart

如果使用的是其他操作系统或发行版,可能需要使用不同的命令来重启 Apache 服务。

到这里,理想中的效果已经实现了:

  • http://share.qiuyedx.com 因为我原本就在Apache2中设置了http重定向https,所以和用https://share.qiuyedx.com访问的效果一致
/* 在同路径下的000-default.conf中的80端口的虚拟主机下添加以下配置 */
/* http重定向https */
RewriteEngine on
RewriteCond   %{HTTPS} !=on
RewriteRule   ^(.*)  https://%{SERVER_NAME}$1 [L,R]
  • https://share.qiuyedx.com 正常访问,且显示为安全连接!

到此,功夫不负有心人,终于配置完成了!

Alist挂载阿里云盘作为WebDav使用

具体可查阅官方文档

方法

我的Alist根目录下有个/阿里云盘的子目录,所以我这里用的话,直接用这个URL即可:

https://share.qiuyedx.com/dav/阿里云盘

需要注意的是,URL中的中文要用编码前的。

如用阿里云盘而不是%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98

用户名和密码与Alist的用户名密码相同。

(但其实不止可以用阿里云盘,支持列表如下)

存储类型列出文件/文件夹下载文件创建目录重命名移动复制上传文件/文件夹
本地存储
阿里云盘
Onedrive
天翼云盘
GoogleDrive
123pan
FTP
SFTP
PikPak
S3
USS
WebDAV
Teambition
分秒帧
和彩云
YandexDisk
百度网盘
夸克网盘

应用举例

支持WebDav的应用有很多,下面列举一些:

  1. Windows
  2. Android
  3. IOS
    • Notability,Nplayer,kmplayer,infuse,Fileball文件管理器,ES文件浏览器
  4. 电视TV
    • Nplayerkodinova魔改
    • 若只看阿里可以使用阿里官方合作的
      • 欢视商店-阿里云盘TV版,网盘播放器-阿里云盘TV版
  5. Mac
  6. Linux

其中我用的最多的是Notability的WebDav备份,可以自动将笔记单向备份到阿里云盘中。比如我刚做完作业,这边云盘里就能看到刚写完的作业了,可以直接发送给学委或者在电脑上保存文件等。

2023-03-29-22.06.52.png

另外就是infuse,如果带宽足够的话,可以将阿里云盘充当NAS使用,组建自己的影音库~


A Student on the way to full stack of Web3.