前置博客(博客中使用的項目來自於此):
【Docker】 .Net Core 3.1 webapi 集成EF Code First,使用MySql進行業務操作 、配置swagger (三)
環境:.Net Core 3.1 , Centos7.6
工具:連接工具MobaXterm,阿里雲服務器一台
1.安裝微軟簽名,不安裝不能使用net。
rpm --import https://packages.microsoft.com/keys/microsoft.asc
2.安裝.net環境,也可以單獨安裝 dotnet-runtime ,但是缺少很多方便的工具包,不推薦。
yum install dotnet-sdk-3.1
3.先修改要發布的端口號,再右鍵項目發布,然后修改信息,發布。
發布完,到目標文件夾把文件拖到 /home/xxx(隨意取名) 目錄下
dotnet Test.dll
使用donet XXX運行項目,Test.dll是項目名。 運行后此項目只能本機訪問,沒有任何作用
PS.運行的時候當前目錄一定要在項目文件夾 , 比如 在 /home/dotnet/Test 下執行 Test.dll ,如果在外部文件夾執行命令會有BUG。
下面使用nginx進行代理轉發請求,使外網也能訪問。
如果啟動的端口是5000
,Nginx 可把5000
端口映射到其他端口。
4.添加 Nginx 存儲庫
在某些Centos版本要添加 CentOS 7 EPEL 倉庫,實測Centos7.8不需要 :
yum install epel-release
5.安裝 Nginx
yum install nginx
6.啟動 Nginx
systemctl enable nginx #設置nginx為開機啟動
systemctl start nginx #啟動nginx服務
// 其他
systemctl status nginx #查看服務器狀態
ps -ef | grep nginx #查看Nginx是否啟動
7.修改 Nginx 配置文件
兩種方法,第一種是把 /etc/nginx/nginx.conf 文件中直接改 server 配置信息
第二種是把 /etc/nginx/nginx.conf 文件中server注釋掉,然后在 /etc/nginx/conf.d/ 添加一個 xxx.conf 配置文件,如下所示
紅色畫圈部分的意思是加載這個文件夾下面的所有 .conf 配置文件
新建一個xxx.conf配置文件
netcore.conf 配置如下
server { listen 80; location / { proxy_pass http://localhost:8001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $http_host; proxy_cache_bypass $http_upgrade; } }
保存后重啟nginx
systemctl restart nginx #重啟 nginx 服務
或者刷新配置
sudo nginx -t #檢查配置文件
sudo nginx -s reload #重新加載配置文件
訪問站點80端口(80端口是默認端口自動隱藏),此端口會被nginx轉發至 8001端口
再看看項目配置的swagger文檔
8.配置守護進程Supervisor
項目啟動只能前台運行,不能進行其他操作,所以要建一個守護進程,使得項目后台運行
安裝 supervisor
yum install supervisor
檢查 /etc/supervisord.conf 配置文件,如果不為圈中代碼,請修改為圈中代碼。
意思是 supervisord.d 文件夾下的所有 ini 類型的文件都是配置文件
到/etc/supervisord.d 目錄下 新建 xxx.ini文件,文件配置內容如下 自己定義,記得一定要改運行命令和程序路徑。
[program:TestNetCore] command=dotnet Test.dll #運行命令 directory=/home/dotnet/Test #程序路徑 environment=ASPNETCORE__ENVIRONMENT=Production #環境變量 user=root #設置啟動進程的用戶,默認是root stopsignal=INT #請求停止時用來殺死程序的信號 autostart=true #自動啟動 autorestart=true #3秒自動重啟 startsecs=3 #自動重啟間隔 stderr_logfile=/var/log/ossoffical.err.log #標准錯誤日志 路徑可以自定義 stdout_logfile=/var/log/ossoffical.out.log #標准輸出日志 路徑可以自定義
保存配置文件,啟動守護進程,然后設置開機啟動
supervisord -c /etc/supervisord.conf #啟動服務
supervisorctl reload #重新加載配置
systemctl enable supervisord #開機啟動
systemctl disable supervisord #取消開機啟動
其他相關操作
supervisorctl shutdown #關閉 supervisorctl reload #重啟 systemctl is-enabled supervisord #驗證是否開機啟動 systemctl status supervisord.service #執行命令,查看服務器啟動失敗的原因 supervisorctl status #查看服務狀態 supervisorctl stop TestNetCore #停止某個服務 supervisorctl start TestNetCore #開始某個服務 supervisorctl restart TestNetCore # 重啟某個服務
測試一下是不是進程停止后supervisor使之自動啟動。
----- 分割線 ----- 2020/12/23號補充 -------
最近在公司管服務器,新學會一種運行方式,特此分享,就是在dotnet xx.dll之前+nohup 后+ &。
nohup dotnet Test.dll --urls="http://*:8001" > /dev/null 2>&1 &
> /dev/null 2>&1 : 將日志輸出至 /dev/null , 2>&1 把錯誤輸出日志和標准輸出日志合並輸出
- 標准輸入文件(stdin):stdin的文件描述符為0,Unix程序默認從stdin讀取數據。
- 標准輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認向stdout輸出數據。
- 標准錯誤文件(stderr):stderr的文件描述符為2,Unix程序會向stderr流中寫入錯誤信息。
寫一個簡單Shell腳本,每次發布項目,重啟項目都使用這個腳本
腳本名定為: restartApi.sh
kill -9 $(ps -ef | grep 'dotnet Test.dll --urls=http://\*:8001' | grep -v grep | awk '{print $2}') cd ./Test && nohup dotnet Test.dll --urls="http://*:8001" & echo "重啟Test.Api執行完成"
說明:
1:搜索到名為 XXX 的進程,過濾掉grep本身進程,再選取輸出結果中的第二條數據(即PID),根據PID殺死這個進程。
2: 進入Test目錄下(項目在./home/dotnet/Test ,restartApi.sh在./home/dotnet), 運行項目。
3:輸出提示
使用 chmod u+x 賦予文件執行權限, 也可以使用 chmod 777 給所有權限。
chmod 777 restartApi.sh
執行腳本
./restartApi.sh
如果出現Killed提示,Ctrl+C退出就可以