-- 在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:配置nginx对asp.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
常见问题
快速入门
详见配置