下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

  • 2
  • 1,847 次浏览
  • A+
所属分类:.NET技术
摘要

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统) 

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统) 

独立观察员 2020 年 7 月 26 日

 

我们有的时候在下载外网的一些文件时会发现下载速度很慢,这个一方面是因为毕竟距离比较远,或者需要跨越多种网络,另外还可能是被技术手段限制了。这时如果直接下载,那这个文件可真是跨越千山万水,历经百般阻挠才能到达我们的设备,不慢才怪呢。而如果我们有地理位置不在大陆(其实关键是接入的骨干网络不一样)—— 比如说香港 —— 的服务器或者 VPS(虚拟服务器),则可以想办法中转一下,因为这些服务器提供商都有对网络进行优化,所以可能有几率能加速下载。

之前按照网上的文章《vps-downloader 文件下载器》 ,本人在自己的 VPS 上搭建过了类似的加速下载器了(http://frps.dlgcy.com:9092/  ,此地址可能会失效,原作者的也失效了):

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

但由于原方案是使用 Python 构建的,而本人对 Python 不熟,说实话有点看不顺眼 Python,加上基于修炼自己主攻语言(C#)的考虑,所以决定用 .NET Core WebAPI 来实现一个同样的下载中转(加速)器。

 

一、创建项目

我们使用宇宙第一 IDE —— Visual Studio 2019 —— 创建一个 ASP.NET Core Web 应用程序:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

选择 .NET Core 3.1 框架,API 模板:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

模板默认会生成一个显示天气的控制器和相关的类,我们可以删除这两个文件并创建自己的控制器:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

新建的控制器代码很简单,就是使用 HttpClient 获取目标 url 的文件流,并重新返回二进制文件流,达到中转下载的目的:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

至此,无论使用 IIS Express 还是 程序自身的运行方式运行:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

都是没什么问题的了:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

Properties 中有个 launchSettings.json 配置文件,可以对启动方式进行一些配置:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

二、使用 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 ,里面有使用方法讲解。

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

简单地说,要在 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:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

这时我们再启动项目,就能看到 Swagger 的页面了:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

点击 Try it out 按钮可以进行调用测试,甚至在这种简单的需求中可以直接当作前台页面使用。

 

三、项目发布及 Linux 环境配置

(一)独立模式

“独立模式 “的意思就是将程序运行所需的依赖环境包和程序本身一起打包,这样程序开箱即用,无需再在系统中安装相关的运行环境(此处即为 .NET Core 运行时)。

我们在项目上右键–> 发布,选择发布到文件夹,设置发布选项(部署模式选 独立,目标运行时选 linux-x64,勾上 生成单个文件):

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

保存配置后点击发布,在目标文件夹生成了项目同名文件(无后缀),以及一些配置文件。由于选择了生成单个文件,所以文件比较大(50+MB):

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

如果不勾上 “生成单个文件 “,则各种依赖文件释放在外面,看着闹心:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

再来说说目标运行时,实际上可供选择的有好几个:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

我的 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​

 

运行成功:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

(二)框架依赖模式

上面说的 “独立模式 “不用在 Linux 系统中安装运行环境,但发布出来的文件大小相对于项目功能来说十分巨大,给部署带来了不便。下面我们来介绍 “框架依赖模式 “,顾名思义,发布的程序不附带运行环境,依赖于系统中安装的运行环境,自然而然地,这样发布出来的程序大小将大大减少。

首先,我们需要安装运行环境,微软官方网址和介绍如下:

https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos 

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

以 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

 

安装好系统运行环境后,我们这次发布时选择 “框架依赖 “模式:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

可以看到生成的主要运行文件只有 2+MB:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

 四、修改监听端口

(使用网络文章《.net core 修改网站启动端口》的第 3 种方式:配置 json 文件)

即在项目中添加一个 host.json 配置文件:

{     //"urls": "http://*:5000;https://*:5001",     "urls": "http://*:5000" }

 

注意生成的时候目录中要出现该文件:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

然后在 Program.cs 中配置使用:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

文字版:

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 的配置:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

但是在服务器上运行时出错了,好像是缺少证书:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

所以干脆只使用 http:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

使用端口配置文件还解决了一个问题,那就是可以允许全部 IP(包括外网)进行访问:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

而如果是直接在之前提到的启动配置文件中配置 “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 页面来测试:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

在参数 url 处填上下载地址后,点击 Execute 按钮: 

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

先是 https 的,出错了:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

再来 http 的,是能正常下载的:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

然后我在本地测试,https 的也是可以下载的,说明是服务器环境的问题:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

经过百度得知,在 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 的可以下载了:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

六、开机运行

方式一:开机后台运行

使用如下组合命令即可在 Linux 系统中后台运行:

nohup ./VPSDownloader.NET &​

 

输出内容会转到 nohup.out 文件中:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

使用宝塔面板的 “开启启动管理 “插件可设置开机启动:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

方式二:开机自启服务

创建启动文件 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

 

执行结果:

下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)

 

可使用以下命令管理服务:

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/

微信订阅号

 

评论已关闭!

目前评论:2   其中:访客  1   博主  1

    • kwen 0

      我这边UI界面用React重写了,地址是 https://vps.kkwen.cn,有需要可以提供给你

        • admin Admin

          @kwen 老哥,你才是可以的