从零开始,将ASP.NET Core部署到Linux生产环境

时间:2021-04-14 04:51:30

研究.NET Core已经一段时间了,一直都是在Windows上开发,这2天尝试着将公司一个很简单的内部Web项目改造成了ASP.NET Core,并且部署到Linux上。生产环境如下:

  1. Linux Ubuntu 14.04
  2. Windows Server 2008, SQL Server 2008 EXPRESS R2

安装SDK

如果Linux服务器可以访问外网,那么按照 官网文档 的指导可以很简单的完成SDK的安装。

不巧的是我找的虚拟机只能访问内网,因此只能通过代理的方式来安装。关于如何设置代理,可以参考这篇文章

在我设置代理以后,按照官方文档的步骤总是在这一步失败,现在也没搞明白原因。

sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893

如果有在这一步失败的小伙伴,可以去DotNet Cli的Dot NET Cli Github主页,下载4个deb文件,按照顺序依次安装。当然安装过程中可能会出现错误,提示缺少依赖的组件,这个时候执行下面的命令即可。

sudo apt-get install -f

项目编译发布

首先把代码拷贝到Linux环境,进入web文件夹,执行以下命令进行编译。

dotnet restore
dotnet run

如果编译没有问题,那么执行以下命令发布

dotnet publish -c [Debug|Release]

发布的文件会拷贝到bin/[Debug|Release]/netcoreapp1.0/publish。这个时候进入publish文件夹,执行以下命令已经可以运行网站了。

dotnet [Your Web Assembly].dll

安装Nginx

按照官方文档的说法,Kestrel不像IIS一样拥有WEB服务器的丰富的特性,因此部署到生产环境时,需要在前面安装一个反向代理服务器接收HTTP请求,并将请求转发到Kestrel。

安装Nginx很简单,执行以下命令即可

sudo apt-get install nginx

然后开始配置Nginx,vim打开/etc/nginx/sites-available/default文件,编辑成如下的配置。

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配置生效

sudo nginx -s reload

安装Supervisor

由于dotnet是我们手动执行的,如果想系统启动时自动启动,就需要写个守护进程。按照官网文档,可以安装Supervisor解决这个需求。

执行以下命令安装

sudo apt-get install supervisor

执行以下命令配置supervisor

sudo vim /etc/supervisor/conf.d/[Your Application Name].conf

在配置文件填写以下内容

[program:[Your Application Name]]
command=/usr/bin/dotnet [Your Publish File Path]
directory=[Your Publish File Path]
autostart=true
autorestart=true
stderr_logfile=/var/log/[Your Application Name].err.log
stdout_logfile=/var/log/[Your Application Name].out.log
environment=ASPNETCORE_ENVIRONMENT=Production,HOME=/var/www/
user=www-data
stopsignal=INT

这里有个坑要注意了,一定要在enviroment里设置HOME变量,否则启动时会报Value cannot be null. Parameter name: Path1这样的错误

配置好以后,重新启动supervisor服务

sudo service supervisor stop
sudo service supervisor start

可以通过以下命令查看supervisor下挂载的进程状态,如果有异常,及时查看上面配置的日志文件

sudo supervisorctl status

连接SQL Server数据库

我在执行以上步骤以后,已经可以访问静态页面了,但是与SQL Server的连接老是出现错误。查了下Github上的Issue,发现是不支持SQL Server 2008 R2。装了SP3补丁以后,发现又不支持命名实例。于是只有重新安装了一个默认实例。这些都搞定以后,项目终于正常运行了。

整个安装过程就是这样,希望这篇文章能帮助到各位小伙伴。

PS:现在回想,才觉得有些东西是很坑的。

  1. supervisor的配置,完全按照官方文档来,是没有设置HOME这个变量。这里的ISSUE提了几个月了也没人管,这个错误提示简直不知所云,还好搜到这个PR,才明白该怎么解决。
  2. SQL Server这个更坑了,只支持SQL Server 2008 R2 SP3我就不吐槽了,居然不支持命名实例。我在安装SP3以后再遇到连接问题都开始怀疑人生了,还好又千辛万苦搜到一个ISSUE。好消息是.NET Core 1.1.0就可以支持命名实例了。