下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)
下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)
我们有的时候在下载外网的一些文件时会发现下载速度很慢,这个一方面是因为毕竟距离比较远,或者需要跨越多种网络,另外还可能是被技术手段限制了。这时如果直接下载,那这个文件可真是跨越千山万水,历经百般阻挠才能到达我们的设备,不慢才怪呢。而如果我们有地理位置不在大陆(其实关键是接入的骨干网络不一样)—— 比如说香港 —— 的服务器或者 VPS(虚拟服务器),则可以想办法中转一下,因为这些服务器提供商都有对网络进行优化,所以可能有几率能加速下载。
之前按照网上的文章《vps-downloader 文件下载器》 ,本人在自己的 VPS 上搭建过了类似的加速下载器了(http://frps.dlgcy.com:9092/ ,此地址可能会失效,原作者的也失效了):
但由于原方案是使用 Python 构建的,而本人对 Python 不熟,说实话有点看不顺眼 Python,加上基于修炼自己主攻语言(C#)的考虑,所以决定用 .NET Core WebAPI 来实现一个同样的下载中转(加速)器。
一、创建项目
我们使用宇宙第一 IDE —— Visual Studio 2019 —— 创建一个 ASP.NET Core Web 应用程序:
选择 .NET Core 3.1 框架,API 模板:
模板默认会生成一个显示天气的控制器和相关的类,我们可以删除这两个文件并创建自己的控制器:
新建的控制器代码很简单,就是使用 HttpClient 获取目标 url 的文件流,并重新返回二进制文件流,达到中转下载的目的:
至此,无论使用 IIS Express 还是 程序自身的运行方式运行:
都是没什么问题的了:
Properties 中有个 launchSettings.json 配置文件,可以对启动方式进行一些配置:
二、使用 Swagger 添加 API 文档自动生成功能
Swagger 能针对我们开发好的 API 方法自动生成网页版 API 文档。通过 VS 中的 NuGet 进行安装,NuGet 库中有很多相似名称的包,经过测试,使用以下三个包可以达到要求:
<ItemGroup> <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.5.1" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.5.1" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUi" Version="5.5.1" /> </ItemGroup>
这些包的项目地址为 https://github.com/domaindrivendev/Swashbuckle.AspNetCore ,里面有使用方法讲解。
简单地说,要在 Startup.cs 中添加如下代码:
//1、引入命名空间; using Microsoft.OpenApi.Models; //2、ConfigureServices 方法中添加; services.AddMvc(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); }); //3、Configure 方法中添加; app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); });
然后我们更改 launchSettings.json 配置文件中的初始启动路径为 swagger:
这时我们再启动项目,就能看到 Swagger 的页面了:
点击 Try it out 按钮可以进行调用测试,甚至在这种简单的需求中可以直接当作前台页面使用。
三、项目发布及 Linux 环境配置
(一)独立模式
“独立模式 “的意思就是将程序运行所需的依赖环境包和程序本身一起打包,这样程序开箱即用,无需再在系统中安装相关的运行环境(此处即为 .NET Core 运行时)。
我们在项目上右键–> 发布,选择发布到文件夹,设置发布选项(部署模式选 独立,目标运行时选 linux-x64,勾上 生成单个文件):
保存配置后点击发布,在目标文件夹生成了项目同名文件(无后缀),以及一些配置文件。由于选择了生成单个文件,所以文件比较大(50+MB):
如果不勾上 “生成单个文件 “,则各种依赖文件释放在外面,看着闹心:
再来说说目标运行时,实际上可供选择的有好几个:
我的 VPS 是 CentOS 7 系统的,自然是在两个 linux 前缀选项中选择,那么具体应该选择哪一个呢?需要在VPS 中使用以下命令(uname -a)判断:
[root@dlgcy VPSDownloaderNET]# uname -a Linux xxx.com 3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
发布到本地成功之后,大家就可以八仙过海各显神通地将这些文件放到 VPS 上的某个目录了(推荐安装宝塔面板),然后赋予可执行权限并运行:
chmod +x ./VPSDownloader.NET
./VPSDownloader.NET
运行成功:
(二)框架依赖模式
上面说的 “独立模式 “不用在 Linux 系统中安装运行环境,但发布出来的文件大小相对于项目功能来说十分巨大,给部署带来了不便。下面我们来介绍 “框架依赖模式 “,顾名思义,发布的程序不附带运行环境,依赖于系统中安装的运行环境,自然而然地,这样发布出来的程序大小将大大减少。
首先,我们需要安装运行环境,微软官方网址和介绍如下:
https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos
以 CentOS 7 为例:
# 1. 添加微软包储存库; sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm # 2. 安装运行时; sudo yum install aspnetcore-runtime-3.1
安装好系统运行环境后,我们这次发布时选择 “框架依赖 “模式:
可以看到生成的主要运行文件只有 2+MB:
四、修改监听端口
(使用网络文章《.net core 修改网站启动端口》的第 3 种方式:配置 json 文件)
即在项目中添加一个 host.json 配置文件:
{ //"urls": "http://*:5000;https://*:5001", "urls": "http://*:5000" }
注意生成的时候目录中要出现该文件:
然后在 Program.cs 中配置使用:
文字版:
public static IHostBuilder CreateHostBuilder(string[] args) { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("host.json", optional: true) .Build(); return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder .UseStartup<Startup>() .UseConfiguration(config); }); }
一开始我也是带上了 https 的配置:
但是在服务器上运行时出错了,好像是缺少证书:
所以干脆只使用 http:
使用端口配置文件还解决了一个问题,那就是可以允许全部 IP(包括外网)进行访问:
而如果是直接在之前提到的启动配置文件中配置 “http://*:5000” 则会报错。
另外,服务器或 VPS 需要开放相关端口,推荐使用宝塔面板进行设置。
五、支持下载 https 协议地址的文件
先给出两个供下载的文件,分别为 https 和 http 地址的:
https://nginx.org/download/nginx-1.16.0.tar.gz
http://dlgcy.com/dlgcy/weixin_dlgcy_blog.png
我们还是用 swagger 页面来测试:
在参数 url 处填上下载地址后,点击 Execute 按钮:
先是 https 的,出错了:
再来 http 的,是能正常下载的:
然后我在本地测试,https 的也是可以下载的,说明是服务器环境的问题:
经过百度得知,在 CentOS 7.x HttpClient 访问会出问题 The SSL connection could not be established, see inner exception
https://www.cnblogs.com/leoxjy/p/11235028.html
按照上面链接给出的方法,最终下载核心代码如下(添加了 HttpClientHandler):
/// <summary> /// 通过 HttpClient 获取另外站点的文件流,再输出 /// </summary> [HttpGet] public async Task<IActionResult> Get(string url) { if (string.IsNullOrWhiteSpace(url)) { _logger.LogTrace("下载地址为空!"); return Content("请在链接后跟上下载地址后再次访问"); } try { // 解决 CentOS7 Https 下载地址出错的问题; var httpClientHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true }; using HttpClient client = new HttpClient(httpClientHandler); var stream = await client.GetStreamAsync(url); return File( stream, "application/octet-stream", // 二进制流 Path.GetFileName(url)); } catch (Exception ex) { return Content($" 出错了:{ex}"); } }
https 的可以下载了:
六、开机运行
方式一:开机后台运行
使用如下组合命令即可在 Linux 系统中后台运行:
nohup ./VPSDownloader.NET &
输出内容会转到 nohup.out 文件中:
使用宝塔面板的 “开启启动管理 “插件可设置开机启动:
方式二:开机自启服务
创建启动文件 Start.sh,输入:
#! /bin/sh cd /dlgcy/VPSDownloaderNET nohup ./VPSDownloader.NET &
创建 VPSDownloader.NET.service,输入
# VPSDownloader.NET.service [Unit] Description=VPSDownloader.NET Service After=network.target [Service] User=root Type=forking ExecStartPre=/bin/sleep 10 ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID ExecStart=/dlgcy/VPSDownloaderNET/Start.sh Restart=always RestartSec=30 StartLimitInterval=20 StandardOutput=/dlgcy/VPSDownloaderNET/log [Install] WantedBy=multi-user.target
创建安装服务脚本 InstallService.sh,输入:
chmod +x ./VPSDownloader.NET chmod +x ./Start.sh touch ./log cp ./VPSDownloader.NET.service /usr/lib/systemd/system/VPSDownloader.NET.service systemctl daemon-reload systemctl enable VPSDownloader.NET systemctl start VPSDownloader.NET systemctl status VPSDownloader.NET
将这三个文件传到 VPS 上后(检查一下上传过程中文件有没有被更改),运行如下命令:
[root@dlgcy ~]# cd /dlgcy/VPSDownloaderNET/ [root@dlgcy VPSDownloaderNET]# chmod +x ./InstallService.sh [root@dlgcy VPSDownloaderNET]# ./InstallService.sh
执行结果:
可使用以下命令管理服务:
systemctl stop VPSDownloader.NET
systemctl start VPSDownloader.NET
systemctl status VPSDownloader.NET
七、后记 & 地址
由于这个基本只是打算自用,所以也未搭建前端页面。建议大家要用的话可以自己搭建一个。下面给出的测试地址不保证以后稳定和能访问。
测试地址:http://frps.dlgcy.com:5000/swagger/index.html
发行版地址:https://gitee.com/dlgcy/VPSDownloader.NET/releases/v20200726
项目开源地址:https://gitee.com/dlgcy/VPSDownloader.NET
同步首发:
http://dlgcy.com/vpsdownloader-net-dotnet-core-linux/