簡單紹一下如何將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的網址了。