[原]CentOS7.2最小安装环境部署Asp.NET Core笔记

转载请注明原作者(think8848)和出处(http://think8848.cnblogs.com)

写在前面的话

不知不觉在cnblogs上注册已经10多年了,看我的园龄就直接暴露了我实际年龄,很多时候看到时间概念时,我总觉得一阵惭愧...自12年开始,我都不知道在忙什么,反正是挺忙的,忙到经常下班就天黑了,以至于偶尔看到傍晚的天空时居然会产生一种莫名的感动。也是从12年开始就很少上cnblogs了,到后来居然莫名奇妙的连用户名和密码都被改了,费了老大劲才又找到,可惜还是改不回我以前那6位的密码了。最近因工作的关系,对这些年一直在做的项目进行了一些反思,发觉一个事实:一个技术性公司或者一名技术人员,轻视技术的话就很容易变成无源之水、无本之木了,因此,是时候好好的学习了,种一颗树最好的时间是十年前,其次就是现在。

写本文的初衷是在CentOS生产环境中部署ASP.NET Core应用程序,为了避免以后又忘记各种步骤,所以还是做点笔记比较好。在此我不打算谈个人对.NET Core技术前景的理解,不管其他人会不会选这个路线,反正我计划是走这个技术路线了。也不打算说明ASP.NET Core项目结构,甚至对于本文涉及的步骤也不解释为什么要这么做(本文涉及的内容比较多,如果全都去说明,篇幅将非常之大,所以我会在相关章节放参考资料链接,希望对您有所帮助)如果您想详细了解本文中每个步骤的含义,请参阅这里本文将主要介绍在CentOS7.2的最小安装环境里,部署ASP.NET Core应用程序的方法。为了达到照着这篇文章能真正将Web网站真正部署成功的目的,每一个环节我都反复做了验证,如果您照着这个步骤做但却被卡在某步,额..我除了建议您检查操作步骤外,只能希望您面向运气的编程经验能足够丰富。通常而言,这种部署工作,环境的影响非常大,一定要多试、多想、多折腾,没有别的好办法,很多时候别人在远程是帮你解决不了问题的,Good luck!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我是分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一、 CentOS环境准备(yum源)

本文使用的CentOS版本

CentOS7.2下载地址:http://iso.mirrors.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso

CentOS7.2最小安装虚拟机文件(本文实验环境,278M)下载地址: http://pan.baidu.com/s/1pLxWuvT  提取码:sqxn

虚拟机安装包:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-12.1.1-3770994.exe

虚拟机你懂的:5A02H-AU243-TZJ49-GTC7K-3C61N

1. 安装wget

sudo yum install wget -y

2. 备份默认yum源

sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

3. 下载阿里云yum源

sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

4. 清除并重建yum缓存

sudo yum clean all

sudo yum makecache

5. 安装EPEL源

sudo yum install epel-release -y

二、安装.NET Core SDK

1. 安装.NET Core SDK

sudo yum install libunwind -y

sudo yum install libicu -y

curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131

sudo mkdir -p /opt/dotnet

sudo tar zxf dotnet.tar.gz -C /opt/dotnet

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

使用 dotnet --info 查看.NET Core安装信息

2. 创建Hello World

cd ~
mkdir projects

cd projects
mkdir hwapp

cd hwapp
dotnet new
dotnet restore
dotnet run

(友情提醒1,不要使用 sudo mkdir hwapp 这种方法创建文件夹,不然...

友情提醒2,如果出现“libunwind.so.8: cannot open shared object file: No such file or directory”错误,请尝试使用 sudo yum install icu -y 修复,很奇怪的是我在实体机安装的版本里遇到这个问题了,但是在虚拟机中没有遇到这个问题,解决问题的办法来自这里,感谢ModestMT.Zou兄)

三、安装Nginx或Apache

3.1 安装Nginx

sudo yum install nginx -y

3.1.1 将Nginx设置为开机启动

sudo systemctl enable nginx.service

3.1.2 启动Nginx

service nginx start

3.1.3 查看Nginx是否安装成功并已经启动

a. 查看进程

ps -ef | grep nginx

b. 查看http head

curl --head localhost

3.1.4 设置反向代理

先将nginx配置文件/etc/nginx/nginx.conf中的默认代理的location节注释掉,免得维护起来不方便(当然如果不嫌那些无关配置看着碍眼,也可以直接在这里配置)

然后在/etc/nginx/default.d目录下新建配置文件

cd /etc/nginx/default.d

sudo vi aspnetcoreapp.conf

文件内容如下(也可以不用建这个配置文件,直接在/etc/nginx/nginx.conf的location节点中输入这些proxy***内容即可)

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;
}

3.1.5 重启nginx

service nginx restart

3.2 安装Apache

sudo yum install httpd -y

3.2.1 设置Apache开机启动

sudo systemctl enable httpd.service

3.2.2 然后启动Apache服务

service httpd start

3.2.3 查看Apache是否安装并启动成功的方法参见上面3.1.3内容

3.2.4 设置反向代理,在/etc/httpd/conf.d目录下创建reverse_proxy.conf文件

cd /etc/httpd/conf.d

sudo vi reverse_proxy.conf

文件内容如下:

<VirtualHost *: 80>
  ServerAdmin think8848.cnblogs.com
  ServerName think8848
  ProxyRequests Off
  <Proxy *>
    Order Deny,Allow
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:5000/
  ProxyPassReverse / http://localhost:5000/
</VirtualHost>

(友情提示:在上面这个配置里面,ServerAdmin和ServerName中间不要包含空格,另外,Order Deny,Allow中的逗号两边也不要带空格,不要问我为什么,等我哭会儿再告诉你)

3.2.5 重启Apache

service httpd restart

四、设置防火墙例外

4.1 备份防火墙配置文件

sudo cp /etc/firewalld/zones/public.xml /etc/firewalld/zones/public.xml.bak

4.2 编辑防火墙配置文件,开放80端口

sudo vi /etc/firewalld/zones/public.xml
<rule family="ipv4">
  <port protocal="tcp"  port="80"/>
  <accept />
</rule>

4.3 重启防火墙

service firewalld restart

4.4 在浏览器中输入虚拟机ip,看看http服务是否可用,不出意外应该能看到这个页面了

(友情提示 ,如果您不知道虚拟机ip是多少,可以使用ifconfig,如果您发现ifconfig居然是无效命令,那么可能需要先安装一下net-tools包,如下: sudo yum install net-tools -y )

a. Nginx

b. Apache

五、新建ASP.NET Core项目

建一个Asp.Net Core项目 ,使用dotnet命令参数请参阅这里

cd ~/projects

mkdir aspnetcoreapp

cd aspnetcoreapp

dotnet new -t web

dotnet restore

dotnet run

应该可以看到ASP.NET Core项目已经可以运行了

但此时使用在其他终端上尝试访问http://CentOS地址,是打不开网站的,主要是因为SELinux限制了访问,你可以先将SELinux临时关闭,看看能不能访问

sudo setenforce 0

可以使用命令查看SELinux是否生效,permissive说明已经关闭了

sestatus

此时访问http://CentOS地址,应该就能看见这个界面了

六、新建SELinux策略

现在我们为SELinux创建策略,使其允许Nginx访问

6.1 创建SELinux策略,首先安装semanage命令包

sudo yum install policycoreutils-python -y

(友情提示,如果在执行 sudo cat ... audit2allow -M httpd_allow 命令过程中发生 could not write output file: [Errno 13] Permission denied: ‘httpd_allow.te‘ )错误,则进入到用户根目录 cd ~ 重试,点击这里查看SELinux和audit2allow相关内容)

6.2 创建并应用SELinux策略

6.2.1 创建Nginx策略

cd ~

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

sudo semodule -i nginx_allow.pp

6.2.2 创建Apache策略

cd ~
sudo cat /var/log/audit/audit.log | grep httpd | grep denied | audit2allow -M httpd_allow

sudo semodule -i httpd_allow.pp

七、安装Supervisor

sudo yum install python-setuptools -y

sudo easy_install supervisor

7.1 生成配置文件

如果用root用户,则直接使用下列语句

echo_supervisord_conf > /etc/supervisord.conf

如果非root用户,则使用下列命令

cd ~

echo_supervisord_conf  > supervisord.conf

sudo mv supervisord.conf /etc

修改/etc/supervisord.conf配置文件,将最后两行修改为:

然后再创建一个supervisor的配置目录

sudo mkdir supervisor.d

在这个目录里面新建一个文件aspnetcoreapp.conf,内空如下

[program:aspnetcoreapp]
command=dotnet aspnetcoreapp.dll
directory=/var/websites/aspnetcoreapp
autostart=true
autorestart=true
stderr_logfile=/var/log/aspnetcoreapp.d/error.log
stdout_logfile=/var/log/aspnetcoreapp.d/output.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT

顺便再创建一下日志文件夹

sudo mkdir /var/log/aspnetcoreapp.d

设置supervisor开机启动

sudo wget -O /usr/lib/systemd/system/supervisord.service https://raw.githubusercontent.com/Supervisor/initscripts/master/centos-systemd-etcs

systemctl enable supervisord.service

(友情提示,如果supervisor有问题搞不定,请参考这里,有关supervisor开机启动脚本,请参考这里)

八、发布ASP.NET Core网站

8.1 发布ASP.NET Core网站前,一些依赖的包要安装一下

sudo yum install npm -y 

sudo npm install -g bower

sudo npm install -g gulp

8.2 发布网站

cd ~/projects/aspnetcoreapp

dotnet publish -o ~/publish

将网站移动到/var/websites目录中

sudo mkdir /var/websites
sudo mv ~/publish /var/websites/aspnetcoreapp

8.3 启动网站

systemctl start supervisord

稍等片刻,应该就可以打开网站了。使用 reboot 命令重启电脑看看网站能不能访问。

(友情提示:如果第一次在使用dotnet publish命令发布网站过程中网络或是其他原因中断了发布,那么就有可能在以后发布时报“Error: Cannot find module ‘***‘”错误,在这种情况下尝试删除项目根目录下的node_modules文件夹,应该就可以解决问题了)

九、使用systemd实现ASP.NET Core开机自动启动

有关systemd的详细资料,请参阅这里这里,在使用systemd实现.NET Core程序开机启动前,请先关闭Supervisor服务,方法如下:

sudo systemctl disable supervisord.service

9.1 创建aspnetcoreapp.service文件

cd /usr/lib/systemd/system

sudo vi aspnetcoreapp.service

9.2 输入配置文件内容

[Unit]
Description=ASP.NET Core systemd demo

Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/dotnet /var/websites/aspnetcoreapp/aspnetcoreapp.dll

[Install]
WantedBy=multi-user.target

9.3 设置开机启动

sudo systemctl enable aspnetcoreapp.service

通常使用dotnet命令运行一个*.dll时,基本上都是在dll所在目录中进行,如果不在dll所在目录,想要运行dll行不行呢?答案是可以的,如: dotnet ~/project/hwapp/bin/hwapp.dll ,这完全没有问题,然而,ASP.NET Core项目直接这么运行则会有问题,如下图所示:

请注意Content root path的值,这对于一个web应用而言,意味着wwwroot等之类的目录全都找不到了,使用curl验证一下,果然发生500错误了

那要怎么解决这个问题呢?so easy,只需要将Program.cs中改一下就可以了

首先引入 using System.Reflection; 命名空间,然后将 .UseContentRoot(Directory.GetCurrentDirecotry()) 行注释掉,在下面加上 .UseContentRoot(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)) ,这行代码对于.NETer不用多解释吧,如下图所示

接下来发布Web网站,然后替换/var/websites下原来的网站,接下来重启电脑

重启后进程里面有aspnetcoreapp.dll,说明网站启动成功了

十、使用Monit监控ASP.NET Core网站服务

到现在貌似一切都看起来还不错,但是还有一个问题,如果使用systemd启动网站,而网站应用挂了,如何能自动恢复服务呢?,这里再引入一个监控工具Monit,关于Monit的更多信息请参阅这里

10.1 安装monit

sudo yum install monit -y

10.2 创建网站监控配置文件

sudo vi /etc/monit.d/aspnetcoreapp.conf

配置内容如下:

check host aspnetcoreapp with address localhost
  start program "/usr/bin/systemctl start aspnetcoreapp.service"
  stop program "/usr/bin/systemctl stop aspnetcoreapp.service"

  if failed host localhost port 5000 protocol http then restart
  if 3 restarts within 3 cycles then timeout

可以使用 sudo monit -t 来测试配置文件是否合法

10.3 配置Monit开机启动

sudo systemctl enable monit.service

重启电脑,应该就能看到启动效果了

10.4 为了展示Monit的监控效果,我们杀死ASP.NET Core网站进程,方法如下:

sudo pkill -9 -f ‘aspnetcoreapp.dll‘

多刷新几次进程,就会发现过了一小会,网站又被启动了

最后一个问题,那干脆不要使用systemd,直接用monit来自动启动ASP.NET Core网站行不行呢?额...这个问题不好说,我尝试了一下将aspnetcoreapp.conf修改成如下:

check host aspnetcoreapp with address localhost
  start program "/usr/local/bin/dotnet /var/websites/aspnetcoreapp/aspnetcoreapp.dll"
  stop program "pkill -9 -f ‘aspnetcoreapp.dll‘"

  if failed host localhost port 5000 protocol http then restart
  if 3 restarts within 3 cycles then timeout

也可以启动Web网站,但是过不了多久就会重启,但是重启时网站也跟着重启,这就尴尬了...这个原因我猜想应该是在monit中启动的dotnet命令,在它的一次check周期结束后monit的check进程就关闭了,而使用这个进程打开的dotnet程序也跟着关了,不知道monit是否有systemd的类似foking的设置,有知道的兄弟吱一声吧。

最最后,才开始接触.NET Core,通过这两天一个简单的学习,个人感觉Nginx+Supervisor的方式效果更好点,ASP.NET Core官方也使用此组合。

时间: 2024-08-07 21:16:41

[原]CentOS7.2最小安装环境部署Asp.NET Core笔记的相关文章

Centos7安装jexus,部署asp.net core,asp.net mvc

什么是Jexus 官网解释:https://www.jexus.org/ Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关,Jexus Web Service,简称JWS,以支持ASP.NET.ASP.NET CORE.PHP为特色,同时具备反向代理.入侵检测等重要功能.可以这样说,Jexus是.NET..NET CORE跨平台的最优秀的宿主服务器,如果我们认为它是Linux平台的IIS,这并不为过,因为,Jexus不但非常快,而且拥有IIS和其它Web服务器所不具备的高度的安

win10下iis部署asp.net core rtm

随着ASP.NET Core 1.0 rtm的发布,网上有许多相关.net core 相关文章,今刚好有时间也在win10环境上搭建下 ASP.NET Core的部署环境,把过程记录下给大家. 1. 开发运行环境 1> Visual Studio 2015 Update 3* 2> .NET Core 1.0 for Visual Studio (包括asp.net core 模板,其中如果机器上没有.net core sdk会默认安装)地址 https://go.microsoft.com/

ubuntu16.4下用jexus部署asp.net core rtm

上篇文章介绍了下用vs发布部署到iis环境,今天说下ubuntu 下部署asp.net core,不需要安装.net core sdk,自带运行时方式部署,利用jexus服务器转发请求到asp.net core. 1.部署准备环境 vmware虚拟机(其他也可以) ubuntu16.04镜像 2.发布环境 win10系统 vs2015 update3 或vs code (也可以用dotnet new -t web 命令创建项目) dotnet sdk  DotNetCore.1.0.0-SDK.

在 Azure 上部署 Asp.NET Core Web App

在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App 服务是个很好的选择. 下面我们会通过 Visual Studio 创建一个 Asp.net Core demo 应用,然后把这个 demo 应用部署到 Azure Web App.通过阅读本文,您将能了解到如何创建 Asp.NET Core 应用程序和如何在Azure上创建 Web App 并部署

Azure 部署 Asp.NET Core Web App

在云计算大行其道的时代,当你在部署一个网站时,第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core 的网站呢?Azure 的 Web App 服务是个很好的选择. 下面我们会通过 Visual Studio 创建一个 Asp.net Core demo 应用,然后把这个 demo 应用部署到 Azure Web App. 通过阅读本文,你将会了解到如何创建 Asp.NET Core 应用程序和如何在 Azure 上创建 Web Ap

Windows + IIS 环境部署Asp.Net Core App

环境:Windows Server 2012, IIS 8, Asp.Net Core 1.1. 不少人第一次在IIS中部署Asp.Net Core App的人都会遇到问题,会发现原来的部署方式无法运行Asp.Net Core App程序.过去无论是原始的Asp程序还是后来的Asp.Net程序,在IIS中的部署方式都没太大变化,仅需指向程序目录,然后设定虚拟目录,最后做一些参数配置.Asp.Net Core App为了做到跨平台,自带了一个轻量级的Web Server - Kestrel,那么要

在CentOS上部署Asp.net Core应用程序

作为一个Linux新手,许多人向我鼓吹说CentOS多么强大,于是我就开始把一个演示程序发布到CentOS,想试一下它到底有多强大.在此之前,我将同样的程序已经成功发布到了Ubuntu,我觉得,既然已经有了前一次的成功经验,不论CentOS还是Ubuntu都是Linux,道理应该差不多吧.但事实证明,还是有些差异的,某些在CentOS上频出的问题在Ubuntu上却没有,所以我的感觉是Ubuntu部署Asp.net Core程序更容易些. 过程很不顺利,但最终经过一天摸索已摸清个七八成,应用总算能

Web Server 在IIS上部署ASP.NET Core项目

在IIS上部署ASP.NET Core项目 一.配置应用程序池为无托管: 二.安装ASPNETCoreModule:(核心) 下载地址:https://go.microsoft.com/fwlink/?linkid=844461 安装包:DotNetCore.1.0.4_1.1.1-WindowsHosting.exe 没有安装是没有红色标记的这项的:

在Linux环境下使用Jexus部署ASP.NET Core

关于如何在Linux中添加ASP.NET Core运行时环境请参考我的上一篇文章,本文章将不再做赘述. 本文章运行环境如下:  (1) 安装独立版Jexus 本教程安装的是独立版的Jexus,独立版的Jexus自带Mono,使用的是Mono的稳定版本4.8.安装 Jexus 直接使用一下命令即可(需要在root身份下执行): curl https://jexus.org/release/x64/install.sh|sh 安装成功后会提示:OK, Jexus has been installed