asp.net core + debian8 + nginx + supervisor部署asp.net core 站点

来源:互联网 发布:cmd连接linux服务器 编辑:程序博客网 时间:2024/05/16 06:02

我使用的是asp.net core sdk1.0,vs使用的是vs2015 update3,服务器是debian8
Linux上sdk1.0的安装方法:http://blog.csdn.net/Chen_Victor/article/details/53427028
vs2015 update3的安装方法:https://www.microsoft.com/net/core#windowsvs2015

发布项目

首先,我们用vs创建一个新的asp.net core mvc项目,对于项目监听的url有两种设置方式。

方法1:
这里写图片描述
打开项目的launchSettings.json,可以看到

{  "iisSettings": {    "windowsAuthentication": false,    "anonymousAuthentication": true,    "iisExpress": {      "applicationUrl": "http://localhost:62246/",      "sslPort": 0    }  },  "profiles": {    "IIS Express": {      "commandName": "IISExpress",      "launchBrowser": true,      "environmentVariables": {        "ASPNETCORE_ENVIRONMENT": "Development"      }    },    "webapp": {      "commandName": "Project",      "launchBrowser": true,      "launchUrl": "http://localhost:5000",      "environmentVariables": {        "ASPNETCORE_ENVIRONMENT": "Development"      }    }  }}

其中"applicationUrl": "http://localhost:62246/"指的是我们使用iisExpress调试时使用的地址,实际部署在Linux服务器上使用的监听地址是"launchUrl": "http://localhost:5000",可以根据实际情况进行修改,但要检测你使用的端口在Linux服务器上有没有被占用,可以使用netstat -anpl | grep 端口号确定端口号是否可以使用。

方法2:
打开Program.cs

namespace webapp{    public class Program    {        public static void Main(string[] args)        {            var host = new WebHostBuilder()                .UseUrls("http://*:51204")                .UseKestrel()                .UseContentRoot(Directory.GetCurrentDirectory())                .UseIISIntegration()                .UseStartup<Startup>()                .Build();            host.Run();        }    }}

其中.UseUrls("http://*:51204")用于设置监听的url,而且这个设置会覆盖掉launchSettings.json的设置,其中可以写入多个监听地址,我们使用51204这个端口,经检查,51204端口可以正常使用。
这里写图片描述

在项目右键然后选择发布,
创建配置文件
这里写图片描述

指定发布文件的目标位置
这里写图片描述
最后点击发布,就可以在目标文件夹PublishOutput看到编译好的发布文件。

然后我们把PublishOutput文件夹整个上传到Linux服务器上。
这里写图片描述

运行dotnet webapp.dll
这里写图片描述
暂时先使用IP+端口号的形式访问
这里写图片描述
可以正常访问.

然后crtl+c关闭web程序。
实际使用中,为了提高用户体验,我们应该只让用户输入url就可以正常,而不是还要记住端口号这么麻烦,下面我们使用功能nginx作为反向代理服务器,转发请求。

配置nginx

根据官网的介绍,asp.net core使用nginx作为反向代理服务器。
安装指令apt-get install nginx
安装成功后进入nginx的安装目录cd /etc/nginx
这里写图片描述
个人建议,使用nginx配置站点时,不要修改nginx的默认配置文件nginx.conf,而是在conf.d文件下话创建属于自己站点的配置文件,实现增量配置的效果,当服务器上配置多个站点时,这样做能清晰的隔离各个站点的配置文件,方便查看和修改。
这里我们创建一个配置文件webapp.conf,并使用最简单的配置方式。
这里写图片描述

server {    listen 80;    server_name www.webapp.com;    location / {        proxy_pass http://127.0.0.1:51204;        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;    }}

当我们只使用IP+端口的形式访问时,不要配置域名,但配置域名有一个好处,可以允许一个服务器上部署过个站点,nginx根据域名的不同,把请求交给不同的站点处理,这里我们使用www.webapp.com作为域名。
创建好配置文件夹后要使用nginx -t检查配置文件语法是否正确,如果正确则使用nginx -s reload重载nginx。
这里写图片描述

现在,我们回到PublishOutput目录下,通过dotnet webapp.dll启动web程序。
因为没有dns服务器解析,所以这里我们使用修改hosts的方式访问域名,在hosts中添加一行192.168.10.139 www.webapp.com,然后访问,结果如下,可以正常访问。
这里写图片描述

这里我们先crtl+c暂时web程序。

配置Supervisor

实际使用中,我们需要将站点部署为守护进程,并具有崩溃重启和日志记录功能。

在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。

安装supervisor指令apt-get install supervisor,安装成功后跟nginx类似,在/ect/supervisor/confg.d/在新建一个配置文件webapp.conf

[program:webapp]command=dotnet webapp.dll  ;要执行的命令directory=/root/webapp/PublishOutput/  ;命令执行的目录environment=ASPNETCORE__ENVIRONMENT=Production ;环境变量user=root  ;进程执行的用户身份stopsignal=INTautostart=true ;是否自动启动autorestart=true ;是否自动重启startsecs=1 ;自动重启间隔stderr_logfile=/var/log/webapp.err.log ;标准错误日志stdout_logfile=/var/log/webapp.out.log ;标准输出日志

值得注意的是,注释使用的;分隔,在网上看到某些博客,使用的是#分隔,作者使用的是ubuntu系统,但是如果在debian中supervisor配置文件中使用#会报错,但是我改成;就正常了。
然后重启supervisor让配置文件生效。

service supervisor stopservice supervisor start

其他常用指令

supervisorctl shutdownsupervisord -c /etc/supervisor/supervisord.conf #重新加载配置文件supervisorctl shutdown #关闭所有任务supervisorctl stop|start program_namesupervisorctl status #查看所有任务状态

这里我们用supervisorctl status查看状态。
这里写图片描述
在我们没有手动启动web程序的情况下,supervisor自动帮我启动了程序,并帮助我们监听这个程序是否正常运行和记录日志。
这里写图片描述

之前尝试用官网介绍的创建服务的形式创建守护进程,但是失败了,具体原因还未查明,如果有朋友有过成功配置经历的可以评论交流一下,地址https://docs.microsoft.com/zh-cn/aspnet/core/publishing/linuxproduction

参考:

  • https://docs.microsoft.com/zh-cn/aspnet/core/publishing/linuxproduction
  • http://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html
0 0