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

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

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

独立观察员 2020726

 

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

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

%title插图%num

 

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

 

一、创建项目

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

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

都是没什么问题的了:

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

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

 

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

(一)独立模式

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

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

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

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

%title插图%num

 

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

 

运行成功:

%title插图%num

 

(二)框架依赖模式

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

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

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

%title插图%num

 

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

 

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

%title插图%num

 

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

%title插图%num

 

 四、修改监听端口

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

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

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

 

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

%title插图%num

 

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

%title插图%num

 

文字版:

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

%title插图%num

 

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

%title插图%num

 

所以干脆只使用 http

%title插图%num

 

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

%title插图%num

 

而如果是直接在之前提到的启动配置文件中配置 “http://*:5000” 则会报错。

 

另外,服务器或 VPS 需要开放相关端口,推荐使用宝塔面板进行设置。

 

五、支持下载 https 协议地址的文件

先给出两个供下载的文件,分别为 https http 地址的:

https://nginx.org/download/nginx-1.16.0.tar.gz 

https://dlgcy.com/dlgcy/weixin_dlgcy_blog.png 

 

我们还是用 swagger 页面来测试:

%title插图%num

 

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

%title插图%num

 

先是 https 的,出错了:

%title插图%num

 

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

%title插图%num

 

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

 %title插图%num

 

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

%title插图%num

 

六、开机运行

方式一:开机后台运行

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

nohup ./VPSDownloader.NET &​ 

 

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

%title插图%num

 

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

%title插图%num

 

方式二:开机自启服务

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

 

执行结果:

%title插图%num

 

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

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

 

原创文章,转载请注明: 转载自 独立观察员(dlgcy.com)

本文链接地址: [下载中转加速器 VPSDownloader.NET(.NET Core 程序部署到 Linux 系统)](https://dlgcy.com/vpsdownloader-net-dotnet-core-linux/)

关注微信公众号 独立观察员博客(DLGCY_BLOG) 第一时间获取最新文章

%title插图%num

发表评论