首页 > 技术文章 > .NetCore在Linux中环境的搭建

mzflog 2021-02-28 15:31 原文

本文实例及工具NetCore3.1、FinalShell

NetCore官方文档

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

请确保有足够权限,建议使用root账号操作

1、配置微软环境,一台服务器配置一次即可

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

 

2、注册更新依赖

sudo yum update

时间有些长,耐心等待,中间有确认下载提示  输入Y,等到出现如下输出compele!则安装完成。

 

3、安装NetCore SDK,SDK中包含了rumtime运行时,所以没必要再去安装rumtime

sudo yum install dotnet-sdk-3.1

默认安装最新的3.1版本(2021-2-23最新为3.1.406),需要下载并安装要耐心等待

 直到Complete

可输入 dotnet –version 可查看安装版本

知道Complete 然后输入dotnet --version 可查看安装版本

 

如果要卸载SDK及微软的相关环境

sudo yum remove dotnet-sdk-*
sudo yum remove libunwind libicu
sudo yum remove
/etc/yum.repos.d/dotnetdev.repo

 

4、测试NetCore项目

配置NetCore项目的默认访问端口,并发布测试项目

public class Program
{
    public static void Main(string[] args)
    {
        //在控制台中创建Web对象
        BuildWebHost(args).Run();
    }
    public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args)
   //设置默认监听端口为5000 此处实例改为5011
   //当有多个项目同时监听时 可变更此处端口
   .UseUrls("http://*:5011")
   .UseStartup<Startup>()
   .Build();
}

 在服务器上新建路径如:/data/Appcode/mzpro 把项目发布后的文件上传该路径下,可使用如FinalShell等以便于相关操作

此时需确认我们所需端口在服务器上是否开启,如果开启则会返回 yes

sudo firewall-cmd --query-port=5011/tcp

如果未开启则需要开启所需端口

firewall-cmd --zone=public --add-port=5011/tcp --permanent   #开放5011端口
firewall-cmd --reload   #重启防火墙
firewall-cmd --zone=public --list-ports   #查看服务器上已开发的端口号

cd至该路径下/data/Appcode/mzpro 然后输入命令

sudo dotnet Mzpro.dll   #注意项目主文件名称

输出信息解释如下
// 侦听地址和端口 Now listening on: http://[::]:5011 // 主机环境:Production Hosting environment: Production // 项目所在目录地址 Content root path: /data/Appcode/mzpro // 提示关闭技巧,Ctrl+C 可以关闭此主机 Application started. Press Ctrl+C to shut down.

此时就可以通过服务器IP+5011的方式访问该项目了。但此时Shell界面不能关闭,如果关闭了就无法访问了,ctrl+c 退出Shell界面。

在Linux中.Net Core默认使用微软官方的Kestrel进行代码托管,所以此时的Shell界面是不可退出的,如果退出项目也就无法访问了。但可以有多种方式解决此问题,比如将Shell界面后台方式

nohup dotnet Mzpro.dll &

比如使用Linux内置服务

# 1.进入/etc/systemd/system/文件夹 新建文件kestrel‐res.service写入以下代码: 
[Unit]
# 说明
Description=Example .NET Web MVC Application running on Centos7 [Service]
# 设置Web目录
WorkingDirectory=/home/Res/
# donet运行指令
ExecStart=/usr/bin/dotnet /home/Res/Res.dll Restart=always
# 如果崩溃了 n秒后重启服务
RestartSec=10 SyslogIdentifier=dotnet‐example
# 以什么身份运行
User=root Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi‐user.target # 设置自动启动服务
systemctl enable kestrel‐res.service
# 启动服务 systemctl start kestrel‐res.service
# 查看服务启动状态 systemctl status kestrel‐res.service
# 如果有问题
# 刷新所有服务项
systemctl daemon‐reload
# 尝试重新启动
systemctl restart kestrel‐res.service

 

但是Linux是一个很复杂的系统 我们的程序也是一个很复杂的程序 在各种断电 断网 系统更新的情况下永远都要保证服务器的正常运行,用上述两种方法都不是正统之道

常见的托管方式有

1、在Azure中进行托管

2、在Windows或Linux平台上使用  Docker  进行托管

3、在Windows平台的 IIS + Http.sys  中进行托管 

4、在Windows平台使用IIS 进程内(InProcess)、进程外托管(Kestrel)

5、在Linux平台上使用Jexus进行托管

6、在Linux平台上使用Supervisor进行托管(官方推荐)

7、在Linux平台上使用 Apache + Kestrel  进行托管 

具体实现及文档后续会陆续总结公布,届时可移步至我关于Supervisor、Jexus、Docker、IIS 等部署方式的相关文章。

才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。

 

推荐阅读