在linux centos7上部署asp.net core应用

-- 在linux centos7上部署运行asp.net core应用
【官网】:#

应用场景

.net core 支持跨平台,本篇就尝试下将asp.net core 应用发布到centos 7上.

基础资源

centos7

使用须知

请注意各个依赖项版本

配置步骤

>理论知识.

>>.netcore的发布分为便携模式,自宿主模式.

发布.NET Core应用程序有两个方式,一种是便携式,一种是自宿主式。便携式发布时,目标程序不带.net core运行环境,所以个头很小,可能只有几十K几百K字节,但是它需要用户的目标系统上安装.NET CORE 框架;自宿主式发布出来的程序,自带运行时和框架类库,自成一体,不需要客户机安装.NET CORE环境,部署简单方便。

[1]自宿主的发布方式进行部署会简单很多,为什么生产环境要使用便携方式进行发布.

原因1:性能比便携式的低(主)。

原因2:微软给出的建议(次)。

----------------------------------

Portable applications(便携应用)

这个类似于现有的.NET Framework方式,需要目标主机安装有.NET Core的运行时,对比现在的情况就是需要机器安装.NET Framework

对于这种方式我想大家都很熟悉了,微软有放出不同平台(操作系统)上的.NET Core运行时。

.NET Core运行时与.NET Framework是同级别但不是同一个。

[优点]易移植,发布的内容较小

[缺点]需要安装.NET Core运行时

Self-contained application(自宿主应用)


这种方式会将运行时与程序共同打包,也就意味着目标机器不需要装.NET Core运行时。

[优点]部署简单

[缺点]发布内容较大

备注

这种方式不是之前所说的.NET Native,也不会有性能提升,因为我们的程序还是IL,还是需要CLR中的JIT进行编译,只是将Core CLR打包进去了而已,可以理解为提供了绿色版的.NET Core运行时,然后提供了一个对应平台的可执行程序来进行加载调用。




[参考]https://docs.microsoft.com/zh-cn/dotnet/articles/core/app-types

性能评价:https://www.linuxidc.com/Linux/2016-11/137010.htm

模式介绍.https://www.linuxidc.com/Linux/2016-11/137009.htm

>实践备忘录.

>>asp.net core发布到centos7.

>>>便携式发布(性能高,微软推荐).

>>>安装libunwind和libicu依赖库.

sudo yum install libunwind libicu

注:CentOS中要安装.net core环境需要libunwind和libicu库,所以要先安装好这两个运行库.

>>>安装.net core 的runtime.

【方案1:基于yum包的安装】

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7.4/packages-microsoft-prod.rpm

sudo yum update     //谨慎执行这个,这个是将整个linux系统升级.

sudo yum install aspnetcore-runtime-2.1

[参考]https://www.microsoft.com/net/download/windows

=>

https://dotnet.microsoft.com/download/linux-package-manager/centos/runtime-2.1.1

【方案2:手动下载安装包文件,安装】

[]由于命令式安装失败并提示没有package,开始手工离线安装.

<步骤1>获取下载地址.

点击后,页面中有个【重试】,悬浮即可看到地址:

得到运行时的地址:


https://download.microsoft.com/download/9/3/E/93ED35C8-57B9-4D50-AE32-0330111B38E8/aspnetcore-runtime-2.1.1-linux-x64.tar.gz


<步骤2:下载>点击上述链接,复制出地址,组成下列命令进行下载。


wget --no-check-certificate -O dotnet-runtime-2.1.1.tar.gz

https://download.microsoft.com/download/9/3/E/93ED35C8-57B9-4D50-AE32-0330111B38E8/aspnetcore-runtime-2.1.1-linux-x64.tar.gz

<步骤3:创建目录位置并解压到目标位置>

示例位置:/usr/dotnet/dotnet2.1

将下载目录的runtime文件解压到上述目标位置.

sudo mkdir -p /usr/dotnet/dotnet-2.1 && sudo tar zxf dotnet-runtime-2.1.1.tar.gz -C /usr/dotnet/dotnet-2.1

<步骤4>创建软连接(类似环境变量).

sudo ln -s /usr/dotnet/dotnet-2.1/dotnet   /usr/local/bin

<步骤5>检查是否安装正确.

dotnet --info




----------------------------------------------

[]如果除部署外还要开发则安装sdk.则需要安装sdk(sdk包含runtime)的方式.

添加yum源:

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

开始安装:

sudo yum install dotnet-sdk-2.1



>>>通过FTP上传dotnetcore项目.

>>>检查dotnet core能否正常运行项目.

[1]出现上述界面,则说明可以运行相关的dll了,但是这时我们无法访问页面,我们需要一个web容器来转发。


>>>配置nginx.

<步骤1:安装nginx,确保安装成功>

[]如果同时安装了apache,要么通过端口进行区分,要么把apache进行停止

<步骤2:配置nginxasp.net core的转发>

修改 /etc/nginx/conf.d/default.conf 文件。//记得备份.

将文件内容替换为


server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

执行:nginx s reload 使其即时生效

接下来再次进入.net core项目目录运行:dotnet x.dll

访问:

http://192.168.215.129:5000/

>>>nginx添加至SELinux的白名单.

上述Bad Gateway这个问题是由于SELinux保护机制所导致,我们需要将nginx添加至SELinux的白名单。

接下来我们通过一些命令解决这个问题。

yum install policycoreutils-python

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

sudo semodule -i mynginx.pp

>>>项目目录运行: dotnet x.dll命令,启动项目.


>>>shell下成功访问项目.

[]因为用nginx进行转发,外面nginx还是80,但会转发到.net core项目.


>>>配置守护服务(Supervisor):实现失败后自动重启.

[]目前位置,整个.net core 虽然能运行,但是是运行在shell模式下,退出命令模式(Ctrl+c)则退出了服务. 以及平常运行时可能中途会有异常,或者服务器重启了等情况也都需要考虑服务的保持。

Supervisor是用来监控asp.net core服务器的,当它异常退出或不运行时自动启动它. 这个是用python开发的,因此需要安装python环境。

<步骤1:安装Supervisor>

sudo yum install python-setuptools

sudo easy_install supervisor

注:也有这么安装的:sudo yum install supervisor -y

<步骤2:配置Supervisor>

mkdir /etc/supervisor

echo_supervisord_conf > /etc/supervisor/supervisord.conf

注:此时,还不能识别出supervisor.

<步骤3:启动supervisor>

新建配置:

/etc/supervisor/conf.d/Linux_DonetCore_Demo.conf

-------内容如下:

[program:Linux_DonetCore_Demo]

command=dotnet Linux_DonetCore_Demo.dll ; 运行程序的命令

directory=/home/ftpspace/duoduole/donetcore_demo/ ; 命令执行的目录

autorestart=true ; 程序意外退出是否自动重启

stderr_logfile=/var/log/Linux_DonetCore_Demo.err.log ; 错误日志文件

stdout_logfile=/var/log/Linux_DonetCore_Demo.out.log ; 输出日志文件

environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量

user=root ; 进程执行的用户身份

stopsignal=INT


---------启动supervisor服务。

[异常1]supervisord another progrom is aleady listening.

解决方案:

查看:find / -name supervisor.sock

解除连接:sudo unlink /tmp/supervisor.sock


再次启动:

supervisord -c /etc/supervisor/supervisord.conf



00001.


supervisord -c /etc/supervisor/supervisord.conf #启动服务

supervisorctl reload #重新加载配置

supervisorctl shutdown #关闭

systemctl enable supervisord #开机启动

systemctl is-enabled supervisord #验证是否开机启动

00002.


     >>>守护服务下正式运行.

[1]检查进程是否启动成功:ps -ef | grep  Linux_DonetCore_Demo

[2]进程存在,外部应该也可以访问了。


[]实现不在shell下的运行donet core网站。


     >>>将守护服务设置为开机启动.

[]下列红色部分的文件,有的是在/etc/supervisord.conf需要根据实际情况确定。

新建一个“supervisord.service”文件

# dservice for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

将文件拷贝至:/usr/lib/systemd/system/supervisord.service


执行systemctl enable supervisord   //设置启动服务.

执行:systemctl is-enabled supervisord #来验证是否为开机启动

[参考]https://www.linuxidc.com/Linux/2016-11/137010.htm


常见问题

快速入门

详见配置

参考资料