.NET Core 3.0】框架之十三 || 部署攻略
?
本文有配套視頻:
https://www.bilibili.com/video/av58096866/?p=9
?
一、部署
1、WIN_獨立部署
感謝群里(白云)小伙伴,博主 @小淋科技? 提出的方案(需要 netcore2.1+ ),我竟然忽略了,該打該打,官檔都讀不仔細,果然三人行必有我師!
微軟官方文檔 ——《獨立部署 (SCD)》,使用這個方法很簡單,只需要部署的時候,選擇指定的平臺,就可以不用安裝其他,比如運行時、托管、SDK等,不過這樣的話,可能下文的命令行操作不適用,不過還是很好很簡單的方案,歡迎嘗試。
?
?
?
?
2、WIN_IIS 部署,前后端不同站點
為了能有一個全新的環境,我還特地新買一臺服務,要做好部署的準備,就必須要先進行初始化操作,也就是先準備好我們用到的原材料:
在服務器開啟 IIS 就不多說了,相信每一個 Dotnet 開發者百分比必須要會的,其他的操作流程請看下邊的步驟,具體的看動圖:
先給自己的兩個站點想好端口,比如我想的:core(1001端口)、Vue(1002端口)
?
0、編譯項目,保證代碼沒問題,并配置 CORS 跨域服務;//下邊動圖中沒有配置CORS,大家自己要注意 ①、發布項目;//請注意我的 publish 路徑是 bin/Debug/netcore3.0,因為這樣肯定不會漏掉文件!!! ②、拷貝到服務器指定文件夾; ③、IIS 添加站點;// 端口 1001 ④、修改應用程序池為“無托管”;//這也是為啥要安裝 windows hosting 的原因 ⑤、安裝 windows hosting(服務托管);//這是一個捆包,已經包含 Runtime(下載地址見下文 錯誤碼 500.19 的解決方案中) ⑥、檢查是否有指定的 Runtime(運行時); ⑦、重啟項目,查看是否正常;http://localhost:1001/ // Vue 部分 ①、Build 項目; ②、拷貝到服務器指定文件夾; ③、IIS 添加站點;// 端口 1002 ④、運行項目,查看是否正常;http://localhost:1002/?
修改好 hash 模式后,就成功了,注意要在 Core 項目中配置 CORS 跨域:
c.AddPolicy("LimitRequests", policy => { // 支持多個域名端口,注意端口號后不要帶/斜桿:比如localhost:8000/,是錯的 // 注意,http://127.0.0.1:1818 和 http://localhost:1818 是不一樣的,盡量寫兩個 policy .WithOrigins("http://127.0.0.1:1002", "http://localhost:1002") .AllowAnyHeader() .AllowAnyMethod(); });?
最終結果如下:
?
?
?
3、WIN_IIS 部署,前后端一個站點
?
從上邊的過程中,可以看出來還是比較簡單的,一氣呵成,行云流水,不過可能自己操作的時候會出現這樣那樣的問題,畢竟我也是給很多小伙伴都部署過,沒有上百,也有五十次了,如果你有錯誤,請看我文章下邊第二章的 常見錯誤 ,找到你遇到的錯誤。
上邊的操作中,我們是把兩個項目部署到了 IIS 中的不同站點,當然,我們也可以部署到一個站點,這樣的話,就是一個域名了,但是絲毫沒有影響我們分開開發,我們前后端攻城獅還是和以前一樣的開發,只是將發布的文件上傳到指定服務器文件夾中就行了。
?
操作步驟和上邊的其實是幾乎一樣的,只不過我們不需要配置 CORS 跨域了,因為是同一個站點,且是只需要一個端口號,我們定為 1003端口
?
?
?
4、WIN_Git_Nginx_Kestrel 部署
上邊的 IIS 部署咱們說完了,大家發現,存在一些問題:
1、過分的依賴 IIS,并沒有完完全全的達到跨平臺的目的;
2、操作步驟偏多,還需要拷貝文件,并且一個都不能少;
3、因為 IIS 會存在占資源的問題,每次如果我們更新 Blog.Core.dll 文件,都需要關閉站點,然后更新,再啟動;
?
那接下來咱們就說說如何使用 Nginx+Kestrel 來簡單的解決這些問題,步驟如下:
?
這里需要安裝 Nginx (http://nginx.org/en/download.html)、Git(https://git-scm.com/downloads)、SDK(http://go.microsoft.com/fwlink/?LinkID=287120),過程省略,大家自行安裝,這里我們把端口定為,NetCore(1004端口)、Vue(1005端口)
?
①、執行 Blog.Core.Build.bat 文件;// 主要是 git pull ,dotnet build 和 dotnet run ②、Nginx 代理服務,將 8081 端口,代理到 1004;//具體的代碼在下邊 ③、查看是否正常;// http://localhost:1004/ // Vue 部分 ①、執行 BS 命令;// cnpm run BS,這里是我自己的命令,主要是git pull 和 build ②、Nginx 代理 Vue 服務,并配置跨域,代理到1005;//具體的代碼在下邊 ③、查看是否正常;// http://localhost:1005/?
大家可以看看,或者直接感受一下,這種部署方案,和 IIS 的方案,哪一個更好一些?三步走,也是很簡單,而也很直觀的。
?
?從上邊的部署中,我們可以看到,過程中我們幾乎都沒有進行什么配置,或者說都是一次性的配置,比如 Git 安裝,比如 Nginx 的學習,只要我們配置了一次,以后多個項目就可以很快的操作了,比 IIS 每一個都要 Publish 并且各種配置來的快些。
不僅如此,我們也換掉了 IIS ,使用了 netcore 自帶的 Kestrel 應用服務器,并且不會出現任何不同步的問題,只要你本地調試好代碼,并 push 到 git 上!
??
?
5、WIN 部署到 Windows 服務
?
微軟有提供?如何在windows服務托管asp.net core?,不過步驟比較麻煩,還需要改源碼,網上找到一種方法?使用NSSM把.Net Core部署至windows服務
簡單說一下步驟
1. 下載nssm:http://www.nssm.cc/download
2. 運行cmd,定位到nssm.exe文件路徑,運行nssm install
3. 在彈出的窗口配置:
Path:dotnet所在的目錄,一般默認是在C:\Program Files\dotnet\dotnet.exe;
Startup directory:程序所在的目錄,就是最后程序dll所在的目錄;
Arguments:程序dll的名稱,一般是項目名加上.dll;
Service name:在此寫上服務的名稱即可。
最后點擊install service 完成windows服務安裝。
在windows服務找到對應服務名,啟動,然后根據launchSettings.json配置的端口訪問,即可調取接口。
4. 如果使用Nginx代理的話,注意端口是5000,不是8081
感謝博友 @小雪轉中雪 提醒
?
?
?
?
6、Linux_Ubuntu_Nginx 部署
?
1、安裝.NET Core?
首先需要安裝.NET Core Runtime:?https://www.microsoft.com/net/download
?
點擊之后,根據您的Linux發行版不同,選擇相應的操作步驟:
?
??
?
最后執行dotnet --info驗證安裝是否成功:
?
2、安裝Nginx
另外還需要安裝Nginx,
安裝好后,直接訪問你的 IP 地址,如果看到如下效果說明安裝成功:
?
修改 nginx.conf 配置代理:
?
修改后,重啟:
?
?
3、在服務器構建源碼并發布
然后就是發布程序了,發布有兩種辦法:
在開發機上執行 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運行:
?
4、配置Nginx
然后我們再回來配置Nginx,進入 /etc/nginx/sites-available ,里面有一個Default文件,把它改個名,然后我們再建立一個新的Default文件:
?
保存后執行 sudo nginx -t ?檢驗這個配置文件。
然后再執行 nginx -s reload 來重啟nginx。
隨后需要再把發布后的程序運行一下:dotnet test.dll:
?
在我使用網址訪問80端口的時候,會自動跳轉到?https//localhost:5001端口,導致連接失敗:
?
可以在開發的時候,就直接去掉項目中使用 https 地址就行,在 launchSettions.json 文件中:
?
?
或者禁用 https 中間件:
?
http://yourdomian.com/swagger/index.html
?
5、守護進程
在/etc/systemd/system 下新建文件(推薦使用winscp),文件名以.service結尾,配置內容為(注意:中文注釋需要刪掉,否則部分 Linux 服務器會報錯):
寫完配置文件后保存,輸入指令確認服務:
systemctl?enable (你的服務名).service ??
例如:systemctl enable HZKJ.service;
然后啟動服務? systemctl start HZKJ.service
然后查看一下服務狀態:systemctl status HZKJ ? 出現狀態說明服務運行正常。
( 借鑒:https://www.cnblogs.com/Tassdar/p/9587829.html )
?
?
7、Linux_CentOs_Nginx 部署
?
1、安裝.NET Core Runtime
首先需要安裝.NET Core Runtime:?https://dotnet.microsoft.com/download/linux-package-manager/centos/runtime-current
點擊之后,根據您的Linux發行版不同,選擇相應的操作步驟:
?
?
?
?
最后執行dotnet --info驗證安裝是否成功:
?
?
?
2、安裝Nginx
另外還需要安裝Nginx,
sudo yum install nginx?
安裝完成后,啟用并啟動Nginx服務:
sudo systemctl enable nginx sudo systemctl start nginx?
啟動成功后,直接訪問你的 IP 地址,如果看到如下效果說明安裝成功:
?
3、Ftp將本地發布后的項目,打包上傳到服務器
1、發布的過程,省略。
?
2、上傳
?
?
?
?
?3、上傳成功,檢查服務器是否存在
在我的目標目錄下,有這些文件:
?
?
?
如果執行 dotnet Blog.Core.dll,這個程序就會在localhost:8081運行:
?
?
?
4、配置Nginx
?
修改 nginx.conf 配置代理:
?然后我們再回來配置Nginx,進入 /etc/nginx,然后 vi 修改nginx.conf ,保存
如果不會操作 Linux ,請查看我的這個文章:http://tibug.neters.club/details/68
?
upstream dotnetblogserver3 { server 127.0.0.1:8081; } server { listen 8082;#請注意,我的項目現在啟動的時候已經是 8081 了,這里就不要再監聽8081了,會報錯,隨便找個其他的端口 server_name localhost; location /{ proxy_pass http://dotnetblogserver3; index index.html index.htm; } location = /50x.html { root html; } }修改后,重啟 nginx:
然后執行 nginx -s reload 來重啟nginx。
?
?
?
隨后需要再把程序運行一下:dotnet Blog.Core.dll 然后訪問我們的 ip:8081 地址。
成功:(臨時服務器,應該過期了)
http://62.234.167.243:8082/
?
?
?
?
5、守護進程
在/etc/systemd/system 下新建文件(推薦使用winscp),文件名以.service結尾,配置內容為(注意:中文注釋需要刪掉,否則部分 Linux 服務器會報錯):
[Unit] Description=HZKJ #服務描述,隨便填就好 [Service] WorkingDirectory=/website/HZKJ #工作目錄,填你應用的絕對路徑 ExecStart=/usr/bin/dotnet /website/HZKJ/CZKJ.CMS.Web.dll #啟動:前半截是你dotnet的位置(一般都在這個位置),后半部分是你程序入口的dll,中間用空格隔開 Restart=always RestartSec=25 #如果服務出現問題會在25秒后重啟,數值可自己設置 SyslogIdentifier=HZKJ #設置日志標識,此行可以沒有 User=root #配置服務用戶,越高越好 Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target?
寫完配置文件后保存,輸入指令確認服務:
systemctl enable (你的服務名).service 例如:systemctl enable HZKJ.service; 然后啟動服務 systemctl start HZKJ.service 然后查看一下服務狀態:systemctl status HZKJ 出現狀態說明服務運行正常。( 借鑒:https://www.cnblogs.com/Tassdar/p/9587829.html )
8、Linux_Docker 部署
?
1、docker安裝
第一種方案:
依次執行下列命令
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum makecache fast sudo yum -y install docker-ce?
第二種方案(綠色的部分):
Install using the repository
Before you install Docker Engine - Community for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.
SET UP THE REPOSITORY
Update the?apt?package index:
$sudo apt-get updateInstall packages to allow?apt?to use a repository over HTTPS:
$sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-commonAdd Docker’s official GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -Verify that you now have the key with the fingerprint?9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.
$sudo apt-key fingerprint 0EBFCD88?
$ sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs)\stable"?
INSTALL DOCKER ENGINE - COMMUNITY
Update the?apt?package index.
$sudo apt-get updateInstall the?latest version?of Docker Engine - Community and containerd, or go to the next step to install a specific version:
$sudo apt-get install docker-ce docker-ce-cli containerd.ioGot multiple Docker repositories?
If you have multiple Docker repositories enabled, installing or updating without specifying a version in the?apt-get install?or?apt-get update?command always installs the highest possible version, which may not be appropriate for your stability needs.
To install a?specific version?of Docker Engine - Community, list the available versions in the repo, then select and install:
a. List the versions available in your repo:
?
查看詳細的命令,可以去官網來安裝:https://docs.docker.com/install/linux/docker-ce/ubuntu/
?
?
第三種方案:
如果你Linux系統是 Ubuntu 版本的,發現不能使用 yum 的話,可以使用 wget:
?安裝成功后,可以啟動服務
?
檢查docker是否安裝成功:
docker version?
若成功顯示如下:
?
?
?完成之后,我們來使用docker來測試一下HelloWorld,通過輸入 docker pull hello-world 來拉取 hello-world 鏡像
?
root@VM-0-3-ubuntu:~# docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8 Status: Downloaded newer image for hello-world:latest?
?
這樣我們就從倉庫拉取到了HelloWorld的鏡像,接下來我們來運行一下,通過輸入docker run hello-world
?
到這里,我們的 Linux 系統下 Docker 環境已經正式配置成功,下邊就是要正式部署我們的項目了。
?
2、Docker 部署
?
如果你有任何Docker部署的問題,可以聯系群友 @趙巖(305353941) ,專業的。
?
2.1、上傳文件到 linux 服務器
在 linux 下創建文件夾 BlogCoreAPI
用 ftp 把發布的文件全部上傳到 BlogCoreAPI
?
2.2、添加 Dockerfile 文件
進入目錄 BlogCoreAPI
cd BlogCoreAPI創建文件 Dockerfile
vim Dockerfile內容如下,說明:鏡像里創建 blogcore 文件夾,復制 linux 上的文件到鏡像目錄,對外暴露 8101 端口,運行程序
FROM microsoft/aspnetcore:2.2 RUN cd /usr/local/src RUN mkdir blogcore WORKDIR /usr/local/src/blogcore COPY *.* ./ EXPOSE 8101 CMD ["dotnet", "Blog.Core.dll"]保存
?
2.3、構建鏡像
鏡像名字叫 blogcore-image,禁用緩存,否則迭代時會出問題
docker build --no-cache -t blogcore-image . //注意這個點 . 表示當前目錄?
2.4、運行容器
用鏡像 blogcore-image 創建容器,指定容器名稱是 blogcore-container,指定時區(默認是美國時間,相差8小時)
docker run --name=blogcore-container -dp 8101:8101--restart=always -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Beijing" blogcore-image //修改默認時區到亞洲/北京,并且將容器里的 8101 端口映射到 linux 主機的 8101 端口,最后每次運行失敗后自動重啟?
如果你想要查看剛剛創建的容器的時區是否成功,可以執行命令:
docker exec blogcore-container date //查詢當前容器時區?
打開瀏覽器訪問試試:http://yourdomian.com/swagger/index.html
?
熱心博友提供知識:@ Mr七師弟?的提醒:
提一個docker下的部署方法吧,?
?
?
2.5、發布更新
上面說的是第一次發布,后期迭代,需要把容器刪除,再構建鏡像,運行容器。
2.5.1 刪除容器
docker container rm -f cchr-container2.5.2 構建鏡像&運行容器
就和上邊的一樣了:
docker build --no-cache -t cchr-image . docker run --name=blogcore-container -dp 8101:8101--restart=always -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Beijing" blogcore-image我還不知道有沒有更快的方法,歡迎提建議。?
?
9、PM2 做進程管理
待補充。
?
?
??
?二、NetCore 錯誤
下邊的都是我平時遇到的常見的錯誤,如果大家還有其他錯誤,可以留言下來,我補充到文章中,讓更多的小伙伴都看到,避免麻煩。
1、錯誤碼 —— 500.00?
?
解析:發布后啟動失敗,進程內,網友提供,暫時我還沒遇到
方案:
方法1:
應用池高級配置 - 啟動32位應用程序 - 設置為True
方法2:
web.config?
?<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" startupTimeLimit="3600" requestTimeout="23:00:00"?hostingModel="InProcess">
刪除?hostingModel="InProcess"
?
?
2、錯誤碼 —— 500.19
?
?
?
解析:未安裝 windows 服務器托管,打不開當前項目的?模塊?選項
方案:
?
安裝和項目匹配的 服務器托管( windows hosting ),這個是捆綁的可執行文件,除了托管,也把x86 和 x64的運行時都一起安裝好了。
地址:https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-3.0.0-windows-hosting-bundle-installer
?
?
?
?
3、錯誤碼 —— 500.21
?
?
?
解析:沒有安裝指定的模塊,如果你想問這個模塊是在項目哪里寫的,可以查看發布后的 web.config 文件
?
?
?
方案:
?
1、如果你沒有安裝上邊的 windows-hosting ,直接安裝就可以解決這個問題;
2、如果已經安裝了服務器托管,發現還沒有這個 V2 模塊,就是你項目的問題了,這個時候你可以從本地再發布 publish 一次,然后拷貝到服務器即可。
? ? ?但是,如果還沒有的話,證明你本地開發的項目異常了,不過這個情況基本可以排除,只要是 SDK 3.0?開發的,本地
?
最終要確保 AspNetCoreModuleV2 模塊被安裝。
?
?
?
?
4、錯誤碼 —— 500.30
?
解析:進程內失敗,這個我沒有遇到,有群里小伙伴說的。
方案:
1、檢查檢查是否安裝了 host?
?
?
?
5、錯誤碼 —— 502.5
?
解析:1、沒有安裝指定的運行時,進程外啟動失敗。
? ? ? ? ? ?2、還有可能是在發布的時候,缺少某些依賴dll文件,可以打開日志調試,請看下邊第七條。
? ? ? ? ? ?3、或者使用 dotnet 命令行查看,是否有錯誤信息在控制臺出現。
?
方案:
?
安裝指定版本的 Runtime 運行時。
一般情況下,只要安裝了服務器托管的話,會自動安裝對應版本的運行時,但是有時候安裝好了,還是會遇到這個錯誤,是因為我們后期項目迭代升級了:
舉個栗子,本來我們的項目是 Netcore 2.2 版本,后來更新到了 3.0?,但是服務器的運行時還是舊的 Runtime 2.2 運行時,我們把代碼部署到服務器,發現沒有指定運行時,就會出現這個問題。
?
下載地址:https://dotnet.microsoft.com/download/dotnet-core/3.0
?
?
2、感謝網友提供資料:@瘋言
502.5 另一種錯誤原因 一般缺少了Blog.Core.Repository.dll 和 Blog.Core.Services.dll
?
?
?
?
6、錯誤碼 —— 503
?
解析:IIS 項目應用程序池未開啟
方案:開啟程序池即可,
?
但是經過測試發現,不使用 “無托管代碼” 也可以,這是為什么,很好奇?
?
?
?
7、An error occurred while starting the application
?
解析:項目已經可以啟動,證明環境已經正常,只不過在項目啟動的時候,出現了錯誤,也就是說是項目代碼的問題。
方案:查看日志,看項目文件是否齊全。
?
?
如果你不知道如何打開日志,請看另一篇文章的這一節:https://www.cnblogs.com/laozhang-is-phi/p/9565227.html#autoid-5-5-0
?
?
?
下邊這個錯誤,就是因為分離的原因,導致 Service.dll 和 Repository.dll ,或者 swagger 的xml 沒有拷貝到發布文件夾下,從而導致項目沒有啟動起來。
?
?
?
?
?
?
?
8、總結
經過上邊多個錯誤分析,如果我們第一次再服務器中部署,只需要安裝 服務器托管 Windows-hosting 即可:
https://dotnet.microsoft.com/download/dotnet-core/3.0
?
?
?
?
?三、Vue 錯誤
1、跨域失敗
?這都是很簡單的錯誤,根據上邊的動圖,咱們也能看出來,關于跨域有以下幾個方法:
1、IIS 部署,一定要在后端 NetCore 項目,進行 CORS 跨域;
2、除非你是在 IIS 中的同一個站點配置前后端兩個項目;
3、如果是 nginx+kestrel 的話,記得在 nginx 中配置跨域代理;
4、其他方案,略;
?
2、頁面刷新 404?
為了這個錯誤,我上邊的第一個動圖,還特地的故意做了這個錯誤,就是 history 和 hash 的情況,當然也是有兩個方案:
如果是IIS部署
1、如果你是 IIS 部署,就使用 hash 模式;
2、如果用IIS,也想用 history 模式,可以配置 URL重寫:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90
?
如果是Nginx部署:
1、不過如果用 nginx 的話,可以利用 404 頁面的機制,將 index.html 頁面 copy 一份,重命名成 404.html 即可;
?
2、如果不想添加一個 404 文件的話 ,就直接修改下 nginx 的配置文件(推薦)
官方解釋:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90
?
?
3、IIS 無法導入組件
在 Blog.Admin 項目中,都嘗試下這兩個導入方式。
?
如果還不行,就直接修改下導入組件的地方吧(感謝群友@聽風者小伙伴提出的方案),不要說不知道這個代碼在哪里修改:
?
?
?
?
?
四、Github & Gitee
?
https://github.com/anjoy8/Blog.Core
https://gitee.com/laozhangIsPhi/Blog.Core
總結
以上是生活随笔為你收集整理的.NET Core 3.0】框架之十三 || 部署攻略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VSCode开发.NETCore项目入门
- 下一篇: .Net Core3.0 配置Confi