事先說明:本人是通過visual studio 2019 + 發(fā)布為文件夾的形式部署 , 通過vs部署發(fā)布的好處在于很多配置項vs會幫我們自動生成到配置文件中
1.確保你的項目是已經(jīng)通過本地測試可以正常運行的,假設(shè)你的項目名為firstapp,后方運行時要用
2.在vs中打開項目,上方菜單欄"生成", 然后點擊 '發(fā)布[你的項目名稱]',然后彈出發(fā)布配置窗口
3.點擊途中綠色圈住的"編輯"按鈕,彈出配置界面
4.發(fā)布方法我們選擇"文件系統(tǒng)",目標(biāo)位置自己設(shè)置一下,即最后打包出的文件夾放在哪
5.我們再點擊左側(cè)的"設(shè)置",得到如下界面
1.配置,表示我們是'Release'還是'Debug'的形式發(fā)布
2.目標(biāo)框架,即netcore使用的版本
3.部署模式,這里就是區(qū)分獨立部署還是依賴部署的地方了,依賴部署的話,要求你服務(wù)器上還要安裝對應(yīng)版本netcore的運行時環(huán)境,我們這里選擇的是獨立部署,即所有依賴文件都會自動打包到你的文件夾中,然后在服務(wù)器上不用安裝netcore就能跑起來了
4.目標(biāo)運行時,我們選擇自己服務(wù)器對應(yīng)的版本就好,這里是演示linux版本,具體32位還是64位服務(wù)器自己確定吧
5.然后我們點保存
6.保存之后回到第一張截圖界面,我們點擊"發(fā)布"
7.等待發(fā)布完成后,得到我們項目的文件夾,假設(shè)名為 myapp
我們可以查看一下myapp文件夾,發(fā)現(xiàn)打包了很多項目中需要用到的dll,還有一些json配置文件和一些linux下的so文件,還有幾個跟你項目名稱相關(guān)的文件...
- firstapp //在linux上通過./firstapp來執(zhí)行整個項目
- firstapp.deps.json //項目依賴文件
- firstapp.dll //項目程序集
- firstapp.pdb //項目調(diào)試文件,會協(xié)助firstapp.dll運行遇到錯誤拋出異常
- firstapp.runtimeconfig.json //運行時配置文件
8.登錄到我們的linux系統(tǒng),一般網(wǎng)站都放在/var/www下,沒有www目錄,我們就新建一個www目錄,如果你只是測試,你放別的地方也可以
9.通過FTP工具將剛打包出來的myapp文件夾上傳到/var/www/目錄下
10.前往對應(yīng)目錄,并執(zhí)行命令即可運行項目
cd /var/www/myapp
./firstapp #這個firstapp是你項目的名字,參見第7條
如果無法執(zhí)行提示權(quán)限問題 Permission denied 或者 no live upstreams while connecting to upstream 錯誤時候
1.那么請嘗試給打包出來的文件夾權(quán)限,777(先嘗試是否是此問題)
2.可能是selinux導(dǎo)致的
/usr/sbin/sestatus 先查看selinux狀態(tài)
vim /etc/selinux/config 修改selinux狀態(tài)
將SELINUX=enforcing 修改為 SELINUX=disabled 狀態(tài)
如果遇到"Process terminated. Couldn't find a valid ICU package installed on the system"的問題
嘗試安裝ICU庫
sudo yum install -y icu
補充,接下來基于Centos補充Nginx + supervisor 來自動啟動并守護(hù)項目進(jìn)程
安裝 Nginx
sudo yum install -y nginx
由于nginx是第一次安裝的圆凰,請通過運行以下命令來顯式啟動:
sudo service nginx start
##如果需要開機(jī)自啟動,請執(zhí)行
systemctl enable nginx.service
修改/etc/nginx/nginx.conf文件,并用以下內(nèi)容替換對應(yīng)的server節(jié)點部分:
配置Nginx
server {
listen 80;
server_name myserver;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
安裝supervisor守護(hù)進(jìn)程
通過yum安裝supervisor,注意,如果使用python pip安裝,那么最好確保是python2的版本,python3現(xiàn)在可以使用supervisor,但是通過pip安裝的可能會出現(xiàn)異常
yum install -y supervisor
配置守護(hù)進(jìn)程信息
切換到supervisord.d目錄,該目錄下的ini文件都會在supervisor服務(wù)啟動時被守護(hù)執(zhí)行
cd /etc/supervisord.d
#在此新建一個supervisor的.ini配置文件
touch myserver.ini
編輯 myserver.ini 文件
[program:myserver]
directory=/var/www/這里填文件夾名稱
command=/bin/bash -c "./myserver"
environment=ASPNETCORE__ENVIRONMENT=Production
user=root
stopsignal=INT
autostart=true
autorestart=true
startsecs=10
stderr_logfile=/var/log/myserver.err.log
stdout_logfile=/var/log/myserver.out.log
下面內(nèi)容為上方文件的說明
#下面所有注釋的內(nèi)容都要刪除,包括這一句
[program:myserver] #配置當(dāng)前守護(hù)進(jìn)程服務(wù)的名稱,supervisord可直接通過名稱啟動服務(wù)
directory=/var/www/myapp #工作目錄,即應(yīng)用程序集所在目錄
command=下方詳解 #執(zhí)行的命令
environment=ASPNETCORE__ENVIRONMENT=Production #表明是生產(chǎn)環(huán)境
user=root #root 權(quán)限
stopsignal=INT
autostart=true
autorestart=true
startsecs=10 #進(jìn)程持續(xù)運行多久才認(rèn)為是啟動成功
stderr_logfile=/var/log/myserver.err.log
stdout_logfile=/var/log/myserver.out.log
注意,上方配置文件中command
參數(shù),這個參數(shù)表示守護(hù)進(jìn)程自動替我們執(zhí)行的命令
例如 python test.py
或者sh test.sh
再或者當(dāng)你安裝了dotnet環(huán)境后,通過依賴部署時,這里會填dotnet firstapp.dll
但是,我們是獨立部署的,通過./firstapp
來運行,但是如果這樣配置command =./firstapp
會發(fā)現(xiàn)守護(hù)進(jìn)程無法啟動,因為不識別這個命令
解決方案:我們通過/bin/bash -c "字符串命令"
這樣來執(zhí)行就可以了,即command = /bin/bash -c "./firstapp"
啟動supervisord 守護(hù)程序,啟動后會執(zhí)行supervisord.d目錄下的ini文件
supervisord -c /etc/supervisord.conf
設(shè)置開機(jī)啟動守護(hù)程序supervisord
systemctl enable supervisord.service
重啟supervisord
supervisorctl reload
最后補充,注意,如果要使用nginx的話,那么還有一些nginx反向代理相關(guān)配置要注意設(shè)置哦,例如
//這里很重要,由于通過nginx轉(zhuǎn)發(fā)給.netcore處理,所以如果不配置此項,那么想在netcore中獲取訪問端的IP的話,導(dǎo)致無法獲取
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});