发布 ASP.NET Core 2.x 应用到 Ubuntu

简单绍一下如何将ASP.NET Core 应用发布到Linux (Ubuntu)服务器上,都是文档的东西。html

 

服务器结构

ASP.NET Core 2.x 有两种server:linux

  • HTTP.sys 只支持Windows,并支持一些Windows独有的特性。
  • Kestrel,跨平台的服务器,高度优化,这个是建议的选项。

这两种server均可以直接服务应用(又叫作边缘服务器 Edge Server),也能够放在负载均衡或反向代理(Reverse Proxy)后边。nginx

 

若是采用Edge Server这种方式:服务器

这种状况下,你须要把证书添加到Kestrel或HTTP.sys来启用HTTPS。并发

可是这样之后很差扩展,由于无法作负载均衡,也无法把流量发送给别的server。app

 

而若是把kestrel放在反向代理后边,例如IIS或Nginx:负载均衡

 

这种状况下,Reverse Proxy可做为负载均衡器,它也能够做为为HTTPS配置证书的惟一地方。tcp

今天要介绍的就是这种方式。优化

 

HTTPS

外边发过来https的请求到Reverse Proxy,而后它会使用HTTP转发该请求到Kestrel Server,转发时还带着一些特殊的Headers。网站

这样的话,像证书配置,加密,HTTPS这些工做就都交给了Proxy Server。

 

这些响应被Proxy使用HTTPS返回:

 

这时,Proxy Server或负载均衡器在内层到Kestrel的HTTP链接上会带着几个Header,这样个人Kestrel就知道这个请求原来是否是HTTPS的。

主要是这三个Header:

 

而在ASP.NET Core的代码里,咱们须要使用ForwardHeaders中间件,在Startup.Configure方法里面修改:

注意它的位置应该在UseHttpsRedirection,UseAuthentication,UseMvc,UseStaticFiles以前。

中间件里面配置是表示让ASP.NET Core来查看XForwardedFor和XForwardedProto两个Header。

 

发布到Ubuntu

安装.NET Core 

首先须要安装.NET Core Runtime: https://www.microsoft.com/net/download

点击以后,根据您的Linux发行版不一样,选择相应的操做步骤:

最后执行dotnet --info验证安装是否成功:

 

安装Nginx

另外还须要安装Nginx,直接查看官网文档吧:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.1&tabs=aspnetcore2x#install-nginx

安装好后,访问这个页面:http://你的ip地址/index.nginx-debian.html,若是看到以下效果说明安装成功:

 

在服务器构建源码并发布

而后就是发布程序了,发布有两种办法:

  • 在开发机上执行dotnet publish而后把发布的文件复制到服务器上
  • 或者直接在服务器上使用源码构建并发布,我通常是这样作的。

因为我是直接在服务器上构建发布,因此我须要安装.NET Core SDK:https://www.microsoft.com/net/learn/get-started-with-dotnet-tutorial

 

而后就可使用发布命令了:dotnet publish --configuration Release

发布好的文件在bin/Release/netcoreapp*.*/publish下面。

再把publish下的全部文件复制到个人目标文件夹便可:

在个人目标目录下,有这些文件:

 

若是执行 dotnet test.dll,这个程序就会在localhost:5000运行:

 

配置Nginx

而后咱们再回来配置Nginx,进入/etc/nginx/sites-available,里面有一个Default文件,把它改个名,而后咱们再创建一个新的Default文件:

 

保存后执行sudo nginx -t检验这个配置文件。

而后再执行 nginx -s reload 来重启nginx。

随后须要再把发布后的程序运行一下:dotnet test.dll:

 

在我使用网址访问80端口的时候,会自动跳转到5001端口,致使链接失败:

这是由于项目里默认使用了HTTPS Redirection。由于我没有证书,因此为了演示,我把HTTPS Redirection相关的代码注释掉,再发布:

 

重复上述步骤以后,经过网址的80端口,就能够正常访问了:

 

NGINX配置证书和HTTPS

配置HTTPS和证书相关的内容直接去看官方文档:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.1&tabs=aspnetcore2x#configure-ssl

添加proxy.conf和编辑nginx.conf后重启nginx便可。

 

按照操做,运行后若是不能使用https正常访问网站,那么有多是没法绑定443端口致使的。

查看nginx错误日志:/var/log/nginx/error.log,若是出现下面的错误:

能够执行下列命令来解决:

sudo fuser -k 443/tcp
service nginx restart

 

而后再次访问https网址:

这样就能够正常访问https的网址了。

相关文章
相关标签/搜索