使用 .NET Core WebAPI 實現一個 VPS 下載中轉(加速)器 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/