https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/install

一、概述

本篇讨论如何把项目发布到Linux环境,主要包括以下内容:

1、项目打包

2、配置Nginx转发

3、配置守护服务Supervisor

在介绍实际内容前,有两个疑问需要探讨一下:

1、我们的项目发布后可以自宿主运行,为什么要配置nginx转发?

答:nginx是专业的网络服务器,功能强大,可以帮忙处理静态资源、SSL等。(简单来说就是Kestrel没有nginx、IIS等专业)

官方解释:Kestrel is great for serving dynamic content from ASP.NET Core. However, the web serving capabilities aren't as feature rich as servers such as IIS, Apache, or Nginx. A reverse proxy server can offload work such as serving static content, caching requests, compressing requests, and SSL termination from the HTTP server. A reverse proxy server may reside on a dedicated machine or may be deployed alongside an HTTP server.

2、为什么要配置守护服务?

答:这个问题比较简单,我们的程序可能没有那么健壮,如果进程意外终止了,守护进程可以自动重新启动进程。

二、打包与发布

利用VS 2017发布项目非常简单,执行发布命令即可。需要注意的是saleservice.xml文件不会被发布,需要手动拷贝到发布目录,有个简单的办法,我把发布的路径从PublishhOutput 改成bin\Release\netcoreapp2.0\,Release模式编译一下再发布就可以,不过这不是什么大问题。

将发布目录copy到目标服务器,运行以下代码启动程序:

# dotnet SaleService.dll

通过运行   # curl http://localhost:5000/api/products   可以查看程序是否运行成功。

由于系统默认监听localhost:5000这个地址,所以即使防火墙开通了5000端口,外部也是无法通过IP来访问的。需要增加以下代码来处理:

        public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://*:5000")
.Build();

当然,如果我们要通过nginx代理访问项目,并不会通过服务器IP来访问,上面步骤就不需要。

在调试项目时,我们在launchSettings.json中设置了启动页面,但项目部署后,这个配置不会有效果,如果希望输入 http://localhost:5000 就跳转到指定页面,需要做如下处理:

修改app.UseMvcWithDefaultRoute()

//app.UseMvcWithDefaultRoute();
app.UseMvc(routes => routes.MapRoute(name: "default", template: "{controller=Account}/{action=Index}/{id?}")); 

增加一个Controller

public class AccountController : Controller
{ public ActionResult Index()
{
return Redirect("/index.html");
}
}

三、配置Nginx代理

1、安装

# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# yum install nginx

2、配置

运行命令:

1
#vi /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和项目。

此时应该可以通过 http://192.168.0.110/api/product 来访问项目,实际访问时,页面报错:

这个问题是由于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

如果通过localhost可以访问,通过IP访问报404错误,请注意确认防火墙是否打开。

四、跨域访问的问题

跨域是指从一个域名的网页去请求另一个域名的资源,跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域。
在前端的Ajax代码中我们把localhost改成了服务器的IP:

1
2
3
4
5
6
$("#query").click(function (event) {
               $.getJSON("http://192.168.109.131/api/products",
                   function (result) {
                       });
                   });
        

此时原来正常的程序会报错:No 'Access-Control-Allow-Origin' header is present on the requested resource

处理办法:

 public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddCors();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors(builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials()); app.UseMvcWithDefaultRoute();
app.UseStaticFiles();
}

其中services.AddCors()可以不用加,WebHost.CreateDefaultBuilder已经加了。

五、配置守护进程

1、 安装Supervisor

1
2
# yum install python-setuptools
# easy_install supervisor

  

2、 配置Supervisor

1
2
3
# mkdir /etc/supervisor
# echo_supervisord_conf > /etc/supervisor/supervisord.conf
# vi /etc/supervisor/supervisord.conf

在文件底部增加:

1
2
[include]
files = conf.d/*.ini

在/etc/supervisor建一个conf.d的文件夹,在其下新建一个saleservice.ini文件,内容如下:

1
2
3
4
5
6
7
8
9
[program:SaleService]
directory=/home/PublishOutput/ ; 命令执行的目录
command=dotnet SaleService.dll ; 运行程序的命令
autorestart=true ; 程序意外退出是否自动重启
stdout_logfile=/var/log/SaleService.out.log ; 输出日志文件
stderr_logfile=/var/log/SaleService.err.log ; 错误日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT

  

启动supervisor

1
supervisord -c /etc/supervisor/supervisord.conf

关闭与重启:

1
2
关闭:supervisorctl shutdown
重启:supervisorctl reload

  

验证我们的项目是否启动成功

1
ps -ef | grep SaleService

  

3、 配置supervisord为服务
在/usr/lib/systemd/system文件夹下新建文件:supervisord.service

1
vi /usr/lib/systemd/system/supervisord.service

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
[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 

这样就可以了。

服务管理的一些命令:

1
2
3
4
5
6
7
8
9
启动/关闭服务
# systemctl start supervisord
# systemctl stop supervisord
 
设置自动启动supervisord
# systemctl enable supervisord
 
验证是否为开机启动:
# systemctl is-enabled supervisord

  

把ngnix也设置为开机自启动,然后重启系统看是否成功

出处:https://www.cnblogs.com/lonelyxmas/p/10523249.html

Centos 安装.NET Core环境的更多相关文章

  1. .NET Core项目部署到Linux(Centos7)(五)Centos 7安装.NET Core环境

    目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...

  2. 快速搭建CentOS+ASP.NET Core环境支持WebSocket

    环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...

  3. Linux - 安装 dotnet core 环境

    Linux -  安装 dotnet core 环境 系统环境:CentOS7 官方安装指导 https://www.microsoft.com/net/learn/get-started/linux ...

  4. centos安装php7.2环境

    centos安装php7.2环境 安装apache服务 yum -y install httpd 首先获取rpm: rpm -Uvh https://dl.fedoraproject.org/pub/ ...

  5. Linux安装.Net core 环境并运行项目

    原文:Linux安装.Net core 环境并运行项目 一 安装环境 1.  从微软官网下载 Linux版本的.NetCoreSdk 2.0 安装包 打开终端: 第一步: sudo yum insta ...

  6. CentOS下安装.net core环境并部署WebAPI

    1.安装CentOS 7 2.安装.net Core 2环境,参考官方文档:(建议采用SDK (tar.gz)安装) https://www.microsoft.com/net/download/li ...

  7. windows 安装 .net core 环境

    windows 安装 环境说明 window10系统 .net core 1.0.1 visual studio code 安装 .net core Windows系统下安装软件基本上属于傻瓜式安装, ...

  8. centos 配置.Net core 环境并部署dotnet Core文件

    一.配置环境[Microsoft dotnet Core] 1) Add the dotnet product feed sudo rpm -Uvh https://packages.microsof ...

  9. Windows/Centos安装GO语言环境

    转载:http://www.haiyun.me/archives/1009.html Centos下使用epel源安装: 1 yum install golang Centos/Linux下源码安装g ...

随机推荐

  1. python学习笔记(十三)处理时间模块

    import time time.sleep(2)#等待几秒 时间的三种表现方式: 1.格式化好的时间 2018-1-14 16:12 2.时间戳 是从unix元年到现在所有的秒数 3.时间元组 想时 ...

  2. 6,Stack

    一,Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out). java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组 ...

  3. 5,Vector

    一,Vector简介 1,Vector 是矢量队列,它是JDK1.0版本添加的类. 2,Vector 继承了AbstractList,实现了List:所以,它是一个队列,支持相关的添加.删除.修改.遍 ...

  4. Linux 系统下文件夹与文件的读写可执行权限问题

    linux是一个多用户操作系统,linux对文件系统内的所有文件,实行了严格的权限划分管理.防止没有权限的用户访问某个文件.linux文件或目录的权限分为 读.写.可执行三种权限.文件访问的用户类别分 ...

  5. GCD 和 NSOperationQueue 的差别

    http://stackoverflow.com/questions/10373331/nsoperation-vs-grand-central-dispatch http://www.cocoach ...

  6. JAVA数组的toString()方法不能直接输出数组内容?

    问题描述:我定义了一个类,类名是Job,当我输出Job.toString()是可以按我重载的toString方法输出的,但是如果输出jobs[]这个数组时,只会输出[Lmodel.Job;@45e22 ...

  7. PADS 学习资料

    PADS软件: PADS9.5_3in1.7z   链接: http://pan.baidu.com/s/1epO4Y    密码: zltl 打不开程序的博友,请看你的电脑有没有安装常用软件运行库 ...

  8. springboot参数校验

    为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证.由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且 ...

  9. 自定义ThreadLocal和事务(基于自定义AOP)

    参考<架构探险--从零开始写javaweb框架>4.6章节 自定义ThreadLocal package smart; import java.util.Collections; impo ...

  10. Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信

    1.Java使用Thread类代表线程.     所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...