簡單紹一下如何將ASP.NET Core 應用釋出到Linux (Ubuntu)伺服器上,都是文件的東西。
伺服器結構
ASP.NET Core 2.x 有兩種server:
- HTTP.sys 只支援Windows,並支援一些Windows獨有的特性。
- Kestrel,跨平臺的伺服器,高度優化,這個是建議的選項。
這兩種server都可以直接服務應用(又叫做邊緣伺服器 Edge Server),也可以放在負載均衡或反向代理(Reverse Proxy)後邊。
如果採用Edge Server這種方式:
這種情況下,你需要把證書新增到Kestrel或HTTP.sys來啟用HTTPS。
但是這樣以後不好擴充套件,因為沒法做負載均衡,也沒法把流量傳送給別的server。
而如果把kestrel放在反向代理後邊,例如IIS或Nginx:
這種情況下,Reverse Proxy可作為負載均衡器,它也可以作為為HTTPS配置證書的唯一地方。
今天要介紹的就是這種方式。
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的網址了。