简单绍一下如何将ASP.NET Core 应用发布到Linux (Ubuntu)服务器上,都是文档的东西。html
ASP.NET Core 2.x 有两种server:linux
这两种server均可以直接服务应用(又叫作边缘服务器 Edge Server),也能够放在负载均衡或反向代理(Reverse Proxy)后边。nginx
若是采用Edge Server这种方式:服务器
这种状况下,你须要把证书添加到Kestrel或HTTP.sys来启用HTTPS。并发
可是这样之后很差扩展,由于无法作负载均衡,也无法把流量发送给别的server。app
而若是把kestrel放在反向代理后边,例如IIS或Nginx:负载均衡
这种状况下,Reverse Proxy可做为负载均衡器,它也能够做为为HTTPS配置证书的惟一地方。tcp
今天要介绍的就是这种方式。优化
外边发过来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。
首先须要安装.NET Core Runtime: https://www.microsoft.com/net/download
点击以后,根据您的Linux发行版不一样,选择相应的操做步骤:
最后执行dotnet --info验证安装是否成功:
另外还须要安装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,若是看到以下效果说明安装成功:
而后就是发布程序了,发布有两种办法:
因为我是直接在服务器上构建发布,因此我须要安装.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,进入/etc/nginx/sites-available,里面有一个Default文件,把它改个名,而后咱们再创建一个新的Default文件:
保存后执行sudo nginx -t检验这个配置文件。
而后再执行 nginx -s reload 来重启nginx。
随后须要再把发布后的程序运行一下:dotnet test.dll:
在我使用网址访问80端口的时候,会自动跳转到5001端口,致使链接失败:
这是由于项目里默认使用了HTTPS Redirection。由于我没有证书,因此为了演示,我把HTTPS Redirection相关的代码注释掉,再发布:
重复上述步骤以后,经过网址的80端口,就能够正常访问了:
配置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的网址了。