|
主题设置

卡片式面板通常用于非白色背景色的主体内

发布到 Linux

.NET Core Web API 可以发布到 Linux 上,向外提供 API 接口。

部署 dotnet 环境

想要在 Linux 上运行 webapi,需要先部署 dotnet 环境。

先通过命令窗口或者 Putty 远程登录到 Linux 服务器。

然后根据项目需要,选择要安装的 .NET 版本。

.NET SDK 3.1 安装

如果之前未添加微软包签名秘钥,需要先添加一下。

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

添加完成

执行安装命令

sudo yum install dotnet-sdk-3.1

遇到这里的时候输入 y 回车即可(有多个地方需要此操作)

第一次:Is this ok [y/d/N] y(确认下载安装包)

第二次:Is this ok [y/d/N] y(下载完成,确认安装)

.NET SDK 3.1 安装完成

验证安装是否成功

dotnet --version

安装成功会显示出安装的版本

.NET Core Runtime 6 安装

执行以下命令以添加 Microsoft 包存储库

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

安装 ASP.NET Core Runtime 6

sudo yum install aspnetcore-runtime-6.0

如果需要安装 .NET SDK 6.0,执行以下命令。(仅仅运行 WEBAPI,不需要在 Linux 上进行项目开发的话,只需要安装 ASP.NET Core Runtime 6 就可以了,不需要安装 .NET SDK 6.0 。)

sudo yum install dotnet-sdk-6.0

第一次:Is this ok [y/d/N] y(确认下载安装包)

第二次:Is this ok [y/d/N] y(下载完成,确认安装)

安装完成

安装完成后,可以通过以下命令验证 ASP.NET Core Runtime 6 是否成功安装。

dotnet --list-runtimes

验证报错了,发现缺少 GLIBCXX_3.4.20 和 GLIBCXX_3.4.21,是因为 CentOS 版本太低或者 libstdc++.so.6 链接的 libstdc 版本太低。需要下载高版本的 libstdc++.so.6文件,替换原有的文件,并重新建立链接。

接下来下载高版本的 libstdc++.so.6文件,替换原有的文件,并重新建立链接。

先进入这个目录

cd /lib64/

下载最新版本的 libstdc.so_.6.0.26

wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip

下载成功

解压

unzip libstdc.so_.6.0.26.zip

备份原来的软连接(也可不不备份,但是建议备份)

mv libstdc++.so.6 libstdc++.so.6.bak

使用最新的库建立软连接

ln -s libstdc++.so.6.0.26 libstdc++.so.6

验证新的软连接是否设置成功

ls -l /lib64/libstdc++.so.6

查看所有版本,这时候已经有了 GLIBCXX_3.4.20 和 GLIBCXX_3.4.21 。

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

再次验证是否安装成功

dotnet --list-runtimes

.NET SDK 8.0 安装

访问 .NET 官方下载页面,选择要下载的版本,复制下载链接。

在 /usr/local/ 中创建 software 文件夹,在 software 文件夹中创建 dotnet8 文件夹,执行 wget 命令进行下载。

mkdir software
mkdir dotnet8
wget https://download.visualstudio.microsoft.com/download/pr/dd6ee0c0-6287-4fca-85d0-1023fc52444b/874148c23613c594fc8f711fc0330298/dotnet-sdk-8.0.302-linux-x64.tar.gz

解压 SDK

tar -zxvf dotnet-sdk-8.0.302-linux-x64.tar.gz

建立软连接

ln -s /usr/local/software/dotnet8/dotnet /usr/local/bin/dotnet

设置环境变量

将 SDK 的 bin 目录添加到系统的 PATH 环境变量中,以便在任何目录下都可以直接使用 dotnet 命令。

export PATH=$PATH:/usr/local/software/dotnet8/bin

然后使用 source 命令使修改生效

source ~/.bashrc  
# 或者  
source /etc/profile

在终端中输入 dotnet --version 命令,如果安装成功,将显示 .NET 8 SDK 的版本号。

发现缺少 GLIBCXX_3.4.20 和 GLIBCXX_3.4.21,是因为 CentOS 版本太低或者 libstdc++.so.6 链接的 libstdc 版本太低。需要下载高版本的 libstdc++.so.6 文件,替换原有的文件,并重新建立链接。

进入这个目录

cd /lib64/

下载最新版本的 libstdc.so_.6.0.26

wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip

下载成功

解压

unzip libstdc.so_.6.0.26.zip

备份原来的软连接(也可不不备份,但是建议备份)

mv libstdc++.so.6 libstdc++.so.6.bak

使用最新的库建立软连接

ln -s libstdc++.so.6.0.26 libstdc++.so.6

验证新的软连接是否设置成功

ls -l /lib64/libstdc++.so.6

查看所有版本,这时候已经有了 GLIBCXX_3.4.20 和 GLIBCXX_3.4.21 。

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

处理完后,输入 dotnet --version 命令,成功显示出 .NET 版本。

如果提示缺少 libicu 库,可以使用 yum 命令进行安装。

sudo yum install libicu

发布

在项目上 “右键——发布”,选择发布到文件夹。

设置要发布的文件夹的位置(默认位置即可)

点击 “发布” 按钮,进行发布。

发布成功

文件上传服务器

对发布成功的文件进行压缩

压缩成功

通过命令窗口将压缩文件传到 Linux 系统

pscp -r C:\Users\zhangsan\Desktop\API\OTWB\bin\Release\net8.0\publish\publish.zip root@192.168.1.2:/usr/local/api

在 Linux 中看到复制成功

对 zip 文件进行解压

unzip publish.zip

解压失败,这是因为 Linux 系统上没有安装 unzip 工具。

先安装 unzip 工具

sudo yum install unzip

unzip 工具安装完成后再次对 publish.zip 文件解压

unzip publish.zip

解压成功

找到 项目名.dll 文件,执行命令。

dotnet 项目名.dll

出现如下报错

这是因为 Linux 中默认是区分大小写的,在程序中 NLog 的配置文件是 Nlog.Config,而在 Program.cs 中引用时,L 变成了大写,使用的是 NLog.Config,所以报错了。

将配置文件改为 NLog.Config 后,重新发布项目,再将文件上传到服务器,最后启动就不会报错了。

以上启动方式只能在本机访问,外面是不能访问的,需要用这个命令启动。(8080是端口)

dotnet 项目名.dll --urls http://*:8080

访问 QuartzUI 成功:http://106.15.202.3:8080/QuartzUI

通过 postman 调用 API:http://106.15.202.3:8080/api/First/ReceiveMsg

这样虽然跑起来了,但是 Shell 一关闭就不行了,这肯定不行,所以我们得给发布的 WEB API 做成自启动。

WEB API 自启动

在 /etc/systemd/system/ 目录里,创建 otwb.service 文件。

touch otwb.service

配置文件内容

vim otwb.service

按下 i 键进入编辑模式,输入如下内容。

按 Esc 键退出编辑模式,输入 :wq 进行保存。

[Unit]
Description=otwb.service
[Service]
WorkingDirectory=/usr/local/api
ExecStart=/usr/local/bin/dotnet /usr/local/api/otwb.dll --urls http://*:8080
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=AspnetCore
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

内容解析:

  • [Unit]
    • Description: 服务的描述信息。
  • [Service]
    • WorkingDirectory: 服务运行时的工作目录。
    • ExecStart: 启动服务的命令。在这个命令中,/usr/local/bin/dotnet 是 dotnet 的目录,/usr/local/api/otwb.dll 是 otwb.dll 的目录。
    • Restart: 定义服务在崩溃后是否重启,以及何时重启。always 表示服务总是重启。
    • RestartSec: 在服务崩溃后等待多少秒再重启。(测试启动失败后,每隔 10 秒会启动 一次,可以通过下面的 “查看服务日志” 命令进行查看)
    • KillSignal: 定义停止服务时发送的信号。SIGINT 通常用于优雅地终止进程。
    • SyslogIdentifier: 系统日志标识符,用于区分日志条目。
    • User: 指定运行服务的用户。在这里,服务以 root 用户身份运行(建议使用非 root 用户提高安全性)。
    • Environment: 设置环境变量,例如 ASPNETCORE_ENVIRONMENT 和 DOTNET_PRINT_TELEMETRY_MESSAGE。
  • [Install]
    • WantedBy: 定义服务的安装目标。这决定了服务在哪些场景下启动。multi-user.target 是常见的多用户系统运行级别。

重新加载 systemd 配置

sudo systemctl daemon-reload

如果希望服务在系统启动时自动启动,执行以下代码。

sudo systemctl enable otwb.service # 设置服务自动启动
sudo systemctl disable otwb.service # 禁止服务自动启动

启动服务

sudo systemctl start otwb.service

检查服务状态

sudo systemctl status otwb.service

可以通过下面的命令查看服务日志

sudo journalctl -u otwb.service -f

访问 QuartzUI 成功:http://106.15.202.3:8080/QuartzUI

通过 postman 调用 API:http://106.15.202.3:8080/api/First/ReceiveMsg

创建运行用户

使用 root 用户来运行服务不是最佳实践,建议创建一个专用用户以提高安全性。

sudo useradd -r -s /bin/false otwbuser
sudo chown -R otwbuser:otwbuser /usr/local/api

修改 otwb.service 中的 User 为 otwbuser

然后重新加载和启动服务

sudo systemctl daemon-reload   # 重新加载 systemd 配置
sudo systemctl restart otwb.service   # 重启服务
sudo systemctl status otwb.service   # 查看服务状态

小贴士

dotnet --list-sdks   # 查看安装了哪些版本 SDK
dotnet --list-runtimes   # 查看安装了哪些运行时
sudo systemctl enable otwb.service   # 设置服务自动启动
sudo systemctl disable otwb.service   # 禁止服务自动启动
sudo systemctl start otwb.service   # 启动服务
sudo systemctl restart otwb.service   # 重启服务
sudo systemctl stop otwb.service   # 停止服务
sudo systemctl status otwb.service   # 检查服务状态
sudo journalctl -u otwb.service -f   # 查看服务日志