在之前的几篇文章中已经介绍了如何一个部分一个部分地综合部署aria2下载环境,详见索引页。接下来结合我国具体国情——用户太多,IP地址太少(至少运营商是这么告诉我们的)——于是公网环境下配置aria2下载环境会有两个问题:其一,公网地址作为个人用户,很可能不是那么好拿到的(指家庭宽带得到公网IP);其二,很容易能拿到公网IP的道路(指用吃灰中的VPS),又有可能律师函警告(指用BT下载版权内容)。因此用aria2下载BT文件的时候,其实P2P上传的那一部分细节就不需要特意去研究了,反正你也只能从具有公网IP的对等客户端下载,同时也只能上传给那些具有公网IP的对等客户端,UPnP还是DMZ主机什么的技术,在通常情况下,跟我们没太大关系。

因此从我们的具体实际出发,对aria2部署的网络环境作如下假设:能访问公网地址,可以访问aria2所在环境的特定端口。那么容器化其实就是一个很好的选择,下面就谈一下容器化后的三个部件容器,当然我也为太长不看的用户准备了一个范例docker-compose文件,修改用户名、密码、和RPC密钥就可以跑起来了:

架构图

那么我们接着往下谈

容器化的Aria2

首先是aria2的本体,容器化之后需要考虑的是aria2的版本可控。因此使用软件仓库中的aria2不是非常恰当,可选的方案有:1、从GitHub的release列表中下载;2、源码编译。在这里我们选择的是从源码编译,容器为多阶段构建方式

编译Aria2

基本上按照代码仓库中的说明文档按部就班即可,可能需要注意的是以Ubuntu:18.04镜像作为基础镜像编译aria2时,需要额外安装一个文档中没有说明的包 liblzma-dev ,否则编译会提示找不到某些依赖库。

启动Aria2

启动部分主要是要关注两个问题:一是如何正确地根据环境变量初始化,二是如何正确地从持久化的数据中加载配置。

第一个方面可以使用 gettext-base 软件包中的 envsubst命令,该命令可以将输入文本中的环境变量部分(即“${……}”)用环境变量的取值替换。因此只需要准备一个模板配置文件(比如说“config.template”),在启动脚本中使用 envsubst < config.template > config 就能得到填入环境变量的配置文件“config”,随后用不覆盖复制,就能解决从数据卷中加载配置的问题。最后我们只需要简单地执行./aria2c --conf-path=/config/aria2.conf即可。

这部分的参考代码在GitHub: https://github.com/jsjyhzy/downloader-parts-aria2

容器化的WebDAV服务

WebDAV服务选择的是WsgiDAV。要问为什么选这个,其实也没什么特殊的原因,大可以选其他的WebDAV服务程序。WsgiDAV的无配置启动相对比较容易,但真的要去配置还是很麻烦的,所以我们就从官方文档中将示例配置稍加修改,也就能用了。下面我们以示例的yaml版本的配置文件为例

WsgiDAV配置文件

主要需要关注两个配置点“ provider_mapping” 和“ simple_dc:user_mapping ”

provider_mapping 定义了挂载点,在这里我们需要将容器内的数据卷(在我的参考代码中是“/data”)挂载到“/webdav”。而 simple_dc:user_mapping 则定义了访问控制列表,因为我们的这套方案是为单用户使用而设计的,因此在这里也只需要定义一个用户,可以用上之前aria2使用环境变量的方法。

这部分的参考代码在也在GitHub:https://github.com/jsjyhzy/downloader-parts-webdav

容器化的Nginx

nginx做反向代理主要需要完成三项工作:1、代理aria2的rpc端口;2、代理WebDAV端口;3、提供AriaNg的静态文件,我们一个一个来说

反向代理Aria2的RPC端口

得益于aria2c使用的rpc是基于HTTP协议的,这为我们使用nginx来反向代理创造了可能性。代理时比较重要的是提供websocket支持,这可以通过在location块中添加:

proxy_http_version      1.1;
proxy_set_header        Upgrade         $http_upgrade;
proxy_set_header        Connection      "upgrade";

来完成websocket的反向代理

反向代理WebDAV

这本来没什么好说的,但wsgidav有一个浏览器友好的界面,它将需要从 “/:dir_browser ”目录中(相对于wsgidav)加载一些js、css文件,如果不妥善处理这一块东西,用是能用,就是不美观。所以不仅要反向代理“/webdav”(相对nginx),还要代理“/:dir_browser”(相对nginx)。

提供静态文件

这一部分可以直接从GitHub下载release版本,解压到随便什么目录,然后用nginx服务静态文件即可。

Last but not least

一般来说我们会在nginx配置文件中使用其他容器的名称来访问对应端口,但是最近的docker不再向/etc/hosts直接写入解析,而是通过内置一个DNS服务来完成容器名-IP地址的解析,因此要在server块中追加一句 resolver 127.0.0.11; 否则将会提示无法解析容器名。

这部分的参考代码在GitHub:https://github.com/jsjyhzy/downloader-parts-nginx

留下评论