研究.NET Core已经一段时间了,一直都是在Windows上开发,这2天尝试着将公司一个很简单的内部Web项目改造成了ASP.NET Core,并且部署到Linux上。生产环境如下:
- Linux Ubuntu 14.04
- 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:现在回想,才觉得有些东西是很坑的。