前言
本文是基于centos8,dotnetcore3.1。
(为了服务器安全使用,程序部署最好不要直接root账号进行操作。)
如果使用sudo命令时候,提示用户不在sudoers文件中的解决方法。原因是centos把用户权限保存在了/etc/sudoers中,并且sudoers默认为只读的。
则需要先以root登录系统,授予当前用户相应的权限
一般操作如下
--第一步、修改文件属性
chmod +wrx /etc/sudoers
--第二步、 执行命令修改配置(或者直接编辑soduers文件在【root ALL=(ALL) ALL】添加username ALL=(ALL) ALL) --其中username为对应的用户名称
echo 'username ALL=(ALL) ALL' >> /etc/sudoers
--第三步、恢复文件属性
chmod -w /etc/sudoers
修改完成后的文件
在Centos中安装NetCore SDK
不同步版本的centos,安装步骤或者命令可能会不一样。最好是参照官方的说明https://docs.microsoft.com/zh-tw/dotnet/core/install/linux-centos
执行命令
sudo dnf install dotnet-sdk-3.1
安装完成后,查看dotnet信息
dotnet --info
发布并部署dotnetcore应用程序
主要由两种方式发布dotnetcore项目:1、vs发布dotnetcore项目,2、使用dotnet publish命令来发布
第一步、发布项目
第一种方式:使用vs发布项目,右键对应的项目--【发布】
【高级】中配置目标框架,部署模式等
第二种方式:使用dotnet命令发布
.Net Core 发布命令与.Net FrameWork发布命令是不同的。.Net FrameWork使用的是donet MSBuild,而.Net Core 可以使用 dotnet publish 。
dotnetcore发布命令示例:dotnet publish D:\ProjectCode\XXX.WebApi.csproj -c release -r win-x64 -o D:\ProjectCode\Release\XXX.WebApi --self-contained false
解释:dotnet publish "解决方案/项目的路径" -c "发布关键字" -r "运行平台" -o "发布输出的路径" --self-contained "是否包含运行时的组件"
当在对应项目目录下执行脚本发布时,则无需指定项目路径,默认当前文件夹的项目;
发布关键字:release或者debug
运行平台:linux还是windows,可以不指定
是否包含运行时的组件:值是true或者false,就是是不包含dotnetcore运行组件,一般在目标服务器上已经安装dotnetcore了,就无需再包含运行组件了。这样可以降低发布包的占用空间,特别是在网络不是很好的情况下,也降低网络传输。
完整示例:
dotnet publish -c release -o bin/publishfile --self-contained -false
当然可以将其做成批处理文件,例如pubish.bat
cd /d %~dp0
dotnet publish -c Release -o bin/publishfile --self-contained false
pause
需要注意的是,部分项目必须文件可能不会随着发布而复制到发布目标文件夹中,需要手动复制,或者指定使用批处理命令来复制。例如swagger需要使用到项目.xml文件
第二步、将发布的目标文件夹进行压缩打包,并上传到centos中进行解压缩
将压缩包上传到centos中,并进行解压缩
第三步,启动项目
运行命令
dotnet xxxx.xxx.dll --urls="http://5589"
示例如下
注意,需要设定Centos防火墙,否则外部无法访问。不建议直接将防火墙关闭
使用ctrl+c可停止当前运行dotnetcore项目。当然直接使用控制台守护进程运行dotnetcore,就无法再进行其他操作了。所以一般不会如此操作。
我们可以以后台运行的方式启动dotnetcore项目
使用命令
nohup dotnet xxx.dll --urls="http://*:5889" > /dev/null 2>&1 &
相关解释
nohup 就是后台运行的命令
/dev/null:/dev/null相当于执行了command 1 > /dev/null。执行command产生了标准输出stdout(用1表示),重定向到/dev/null的设备文件中
/dev/null可以理解为/dev路径下的空文件;该命令将command命令的标准输出输出到空文件中
2>&1:可以理解为执行command产生的标准输出重定向到文件中,标准错误也重定向到文件中,期间只打开一次文件,&1的含义就可以理解为用标准输出的引用,引用的就是重定向标准输出产生打开的文件。
最后的 & 是必须的!
运行示例
管理dotnetcore程序
ps -aux | grep dotnet #查看dotnetcore进程
kill xxxx #杀死xxxx进程,xxxx为进程Id
(启动的dotnet项目,但是外部可能无法访问,有可能是因为没有配置开放防火墙对应的端口所致。)
虽然后台运行可以不影响控制台进程进行其他操作,但是后台运行没有对应的守护,而且不方便管理。所以很多时候会借助supervisor进行管理。这个后续再补充了。