【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目
目录索引
简介
ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下,我们windows上的项目如何发布项目到Linux上运行。我这里有个在windows上搭建过的程序,我们主要演示如何在linux上运行,所以大家不要纠结于这些,大家可以新建一个web项目尝试一下。
安装.NET Core SDK for CentOS
微软有详细的安装命令,可以参考Install .NET Core SDK
① 安装 libicu 依赖: sudo yum install libunwind libicu
安装成功:
② 下载 SDK 压缩包: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 来查看一下,出现如下界面,表示成功:
测试项目运行
注意:不熟悉Linux的朋友请注意,Liunx下路径是区分目录大小写的。
① 新建一个目录:mkdir TestApp
② 进入目录:cd TestApp
③ 新建一个默认的 web 项目:dotnet new -t web
④ 还原包:dotnet restore
这个时间可能比较长,看网速了,大家要耐心等待。
⑤ 我们来运行一下:dotnet run
发布我们的项目到Linux
大家可以使用Ftp等方式将文件发布到服务器上,我这里直接发布到本地文件夹中,然后通过FileZilla 发送到服务器上。
发布项目的方式有多种,比如可以使用 dotnet publish 命令,我们这里使用 VS :
首先,我们打开 Project.json 来添加几个发布的运行时(这一步可以不要,如果不配置这里,那么发布的时候是 Any,我们待会讲到)
然后,右击我们的项目,选择发布:
新建一个发布配置文件,发布方法选择 文件系统 :
设置里,我们选择目标运行时:centos.7-x64 (在上面,我们讲到 Project.json 里添加了 几个运行时,如果没有那一步,那么这里 没有选项,只有一个 Any)
然后点击发布,我们把发布完的文件上传到CentOS上:我放到了 Wwwroot 目录下
我们来编译我们的文件:dotnet XXX.dll
这里先为大家演示一个 错误 :我的 wkmvc.dll 是在 Wwwroot 目录下的 ,所以 我执行命令(注意路径大小写,Linux区分大小写,我们上面提到) dotnet Wwwroot/wkmvc.dll
显示成功了,我们打开浏览器,输入 localhost:5000
是空白的,我们修改一下我们的程序,输出一下日志看看:
这是什么原因呢?为什么没找到Index.cshtml呢?请大家再次注意一下 我们的 Content root path,答案是 她没有对 root 的操作权限的,我们来对比一下 我们安装过程中 测试成功的 web 和 我们这个 web 的 Content root path
我们来尝试一下:我们进入Wwwroot目录下,然后执行 dotnet wkmvc.dll
我们再次打开浏览器,输入 localhost:5000
是不是 OK 了,我们来进入我们的区域的 登录页 测试一下:
也没有问题,到此,项目就运行成功了,但是在实际中,我们可能还要安装 nginx 、配置我们的 FireWall 以及配置守护服务 Supervisor 等等,这里就不演示了。
既然大家不是很了解,或者网上找资料比较繁琐,对于 nginx firewall 以及 supervisor 的配置,我就再一步一步给大家演示一下。
安装Nginx
Nginx 的安装比较简单,就三条命令:
① curl -o nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
② rpm -ivh nginx.rpm
③ yum install nginx
启动 Nginx:systemctl start nginx
设置开机启动(linux宕机、重启会自动运行nginx不需要连上去输入命令):systemctl enable nginx
配置防火墙
① 开放80端口:firewall-cmd --zone=public --add-port=80/tcp --permanent
② 重启防火墙以使配置即时生效:systemctl restart firewalld
我们来测试一下Nginx是否可以访问:
配置Nginx对ASP.net Core 应用的转发
修改 Nginx 的 default.conf 文件(目录:/etc/nginx/conf.d/default.conf)
将内容替换为(配置Nginx转发):
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;
}
}
上传覆盖default.conf文件
重新加载,即时生效:nginx -s reload
我们来测试一下:
这是什么鬼?这个问题是由于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
我们再次尝试访问:
Supervisor 守护服务
为什么要这个玩意呢?
我们先来看下我们存在的问题:① 我们在上面演示中,运行我们的应用都是通过 dotnet ***.dll 或者 dotnet run ,也就是我们的 ASP.NET Core应用程序运行在shell之中,如果关闭shell则会发现ASP.NET Core应用被关闭,从而导
致应用无法访问。
② 如果ASP.NET Core进程意外终止那么需要人为连进shell进行再次启动。
③ 如果服务器宕机或需要重启我们则还是需要连入shell进行启动。
那么要解决这些问题,我们就必须要实现这么一个功能:如果ASP.NET Core 意外终止,那么我们要自动重启;如果服务器服务器重启后,我们要有个类似脚本命令一样,自动执行 dotnet 命令。
现在正好有个基于 Python 开发的工具 Supervisor 可以解决我们上述问题:
① 安装Supervisor:
1.1:yum install python-setuptools
1.2:easy_install supervisor
② 配置Supervisor:
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
③ 配置 Supervisor 对 Asp.net Core 应用的守护:
这里有个重要说明:很多文档包括微软的官方文档都是 在/etc/supervisor 目录下 新建一个目录 conf.d 然后在conf.d 目录下新建一个conf文件,将下面这段代码放到这个文件里,然后修改 /etc/supervisor/supervisord.conf的最后一行 [include] files= relative/directory/*.ini 修改为 [include] files = /etc/supervisor/conf.d/*.conf,但是我一直没有成功,尝试了各种办法,排查了各种错误,都没有成功,所以,我直接写在了/etc/supervisor/supervisord.conf里(如下),成功了,所以,大家可以尝试以下上述。
修改 supervisord.conf 文件(目录:/etc/supervisor/supervisord.conf),添加程序:
[program:wkmvc]
command=dotnet /root/Wwwroot/wkmvc.dll
directory=/root/Wwwroot/
autostart=true
autorestart=true
stderr_logfile=/var/log/wkmvc.err.log
stdout_logfile=/var/log/wkmvc.out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT
如果服务已经启动,则需要使用 supervisorctl reload 命令来使新的配置生效,当然,我们这里并没有启动,所以不需要这一步。
执行:
supervisord -c /etc/supervisor/supervisord.conf
启动服务,然后我们来看下:
ps -ef | grep wkmvc
④ 配置Supervisor开机启动:
新建一个“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
希望跟大家一起学习Asp.net Core
刚开始接触,水平有限,很多东西都是自己的理解和翻阅网上大神的资料,如果有不对的地方和不理解的地方,希望大家指正!
虽然Asp.net Core 现在很火热,但是网上的很多资料都是前篇一律的复制,所以有很多问题我也暂时没有解决,希望大家能共同帮助一下!
原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com
【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目的更多相关文章
- 发布项目到 Linux 上运行 Core 项目
发布项目到 Linux 上运行 Core 项目 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win ...
- Linux04 /创建虚拟环境、在linux环境运行Python项目
Linux04 /创建虚拟环境.在linux环境运行Python项目 目录 Linux04 /创建虚拟环境.在linux环境运行Python项目 1. 大体流程 2. linux环境安装python3 ...
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Visual Studio 2017 通过SSH 调试Linux 上.NET Core
Visual Studio 2017 通过SSH 调试Linux 上.NET Core 应用程序. 本文环境 开发环境:Win10 x64 Visual Studio 2017 部署环境:Ubuntu ...
- 在Linux上部署Web项目
You believe it or not there is a feeling, lifetime all not lost to time. 在Linux上部署Web项目 这个是普通的web项目, ...
- VS2017 Linux 上.NET Core调试
调试Linux 上.NET Core Visual Studio 2017 通过SSH 调试Linux 上.NET Core 应用程序. 本文环境 开发环境:Win10 x64 Visual Stud ...
- linux安装docker,并在docker上运行springboot项目
docker架构示例图 仓库---> 镜像 ---> 容器 一.安装docker 1.通过 uname -r 命令查看你当前的内核版本 uname -r 2使用 root 权限登录 Ce ...
- Vue2+VueRouter2+webpack 构建项目实战(三):配置路由,运行页面
制作.vue模板文件 通过前面的两篇博文的学习,我们已经建立好了一个项目.问题是,我们还没有开始制作页面.下面,我们要来做页面了. 我们还是利用 http://cnodejs.org/api 这里公开 ...
- ASP.NET MVC5快速入门--MyFirstWeb并发布到Windows Azure上
博主刚刚学习ASP.NET MVC5,看着微软的文档一点点学,就把FirstWeb的建立展示一下下啦,本次建立一个带个人身份验证的例子(即有注册登录机制的动态网页),开始,啦啦啦~~ 新建一个项目,选 ...
随机推荐
- 香蕉云APP,2016下半年开发日记
2016-6-17 数据库设计不应该过多依赖范式,适度的冗余可以加快搜索速度,在服务器的配置还可以的情况下,可以采用冗余来解决查找慢的问题.还一个是要选择好数据库引擎,例如 InnoDB 和 myi ...
- SignalR系列目录
[置顶]用SignalR 2.0开发客服系统[系列1:实现群发通讯] [置顶]用SignalR 2.0开发客服系统[系列2:实现聊天室] [置顶]用SignalR 2.0开发客服系统[系列3:实现点对 ...
- MFC中成员变量的声明顺序与析构顺序
第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...
- CSS3新特性应用之结构与布局
一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...
- JavaScript中的this
本文尽量避免概念性的讲解,那样太抽象 所以下面以一些简单的例子,从易到难对this的用法总结 1.方法中的this会指向当前执行该方法的对象 如: var name = "window&qu ...
- QDEZ集训笔记【更新中】
这是一个绝妙的比喻,如果青岛二中的台阶上每级站一只平度一中的猫,差不多站满了吧 自己的理解 [2016-12-31] [主席树] http://www.cnblogs.com/candy99/p/61 ...
- C#移动跨平台开发(1)环境准备
C#依托于mono平台可以实现Unix平台服务器端开发已经不是什么新鲜事了,而Xarmain公司(初始成员大多来自原Mono.MonoTouch.Mono For Android成员)继续将C#的先进 ...
- 【腾讯bugly干货分享】微信Android热补丁实践演进之路
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1264& ...
- .NET里简易实现IoC
.NET里简易实现IoC 前言 在前面的篇幅中对依赖倒置原则和IoC框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只 ...
- C# 开发windows服务的一些心得
最近在做一个windows服务的项目,发现并解决了一些问题,拿出来和大家分享一下,以下windows服务简称“服务” 文章会在适合时间更新,因为朋友们在不断提出新的意见或思路,感谢-.- 1.服务如何 ...