.NET Core Web API 可以发布到 Linux 上,向外提供 API 接口。
想要在 Linux 上运行 webapi,需要先部署 dotnet 环境。
先通过命令窗口或者 Putty 远程登录到 Linux 服务器。
然后根据项目需要,选择要安装的 .NET 版本。
如果之前未添加微软包签名秘钥,需要先添加一下。
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
安装成功会显示出安装的版本
执行以下命令以添加 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 官方下载页面,选择要下载的版本,复制下载链接。
在 /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 做成自启动。
在 /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
内容解析:
重新加载 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 # 查看服务日志