背景
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
启动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。ProxyPass
和 ProxyPassReverse
指令将请求转发给本地的 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.com
和 share.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的应用有很多,下面列举一些:
- Windows
- Android
- IOS
- Notability,Nplayer,kmplayer,infuse,Fileball文件管理器,ES文件浏览器
- 电视TV
- Mac
- Notability,IINA,Mountain Duck,infuse,netdrive,rclone
- Linux
- davfs2,rclone
其中我用的最多的是Notability的WebDav备份,可以自动将笔记单向备份到阿里云盘中。比如我刚做完作业,这边云盘里就能看到刚写完的作业了,可以直接发送给学委或者在电脑上保存文件等。
另外就是infuse,如果带宽足够的话,可以将阿里云盘充当NAS使用,组建自己的影音库~
Comments 5 条评论
博客作者 Echo
这是一条私密评论
博客作者 QiuYeDx
@Echo 给我按死了 不准动
博客作者 匿名
#私密# 还是你比较nb
博客作者 匿名
噢噢,感谢教程太棒了!!
博客作者 QiuYeDx
@匿名 有所帮助就好(=・ω・=)