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

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

独立观察员 2020 年 7 月 26 日

 

我们有的时候在下载外网的一些文件时会发现下载速度很慢,这个一方面是因为毕竟距离比较远,或者需要跨越多种网络,另外还可能是被技术手段限制了。这时如果直接下载,那这个文件可真是跨越千山万水,历经百般阻挠才能到达我们的设备,不慢才怪呢。而如果我们有地理位置不在大陆(其实关键是接入的骨干网络不一样)—— 比如说香港 —— 的服务器或者 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/

微信订阅号

 

posted @ 2020-07-27 09:23  独立观察员  阅读(1624)  评论(2编辑  收藏  举报