1. 程式人生 > >又一篇Centos7下的asp.net core部署教程

又一篇Centos7下的asp.net core部署教程

歷程2個多月的學習,我終於從PHP轉.Net開發了。

雖然網上已經有很多關於asp.net core在linux下的部署教程了,但我還是想寫一篇,主要增強我自己的記憶。

搭建的環境為Centos7 + .net core  + nginx + mysql5.7,我的網站是asp.net core後端,vue前端,資料據mysql;

第一次搭建時遇到不少的坑,我會在下面也說到

前提,你有一臺可以聯網,有root賬號密碼,有開通ssh的伺服器(一般centos7安裝預設都有開通了)

 

安裝donet執行環境

用root登入伺服器後,第一步就是安裝dotnet執行庫了

開啟https://dotnet.microsoft.com/download,我寫這篇部落格時,還是net core2.2,3.0預覽版也出了,不知到時會不會有什麼變動。

只執行,不開發,只需安裝runtime執行庫。

 選擇Centos,然後執行以下紅圈的命令,我沒執行yum update,感覺沒什麼影響。

 

 然後輸入命令 dotnet --info,可看是否有執行庫

 

恭喜你,已經安裝成功了

然後把你的asp.net core釋出後的檔案上傳到伺服器上,我用的是WinSCP上傳軟體,用你的root賬號密碼登入,協議為SFTP

 

我上傳到/var/www/dotnet,建議上傳到/var目錄,一開始我上傳到root目錄,後面會出現一些訪問許可權的問題

 

 

 然後在linux中切換到.net目錄上,cd /var/www/dotnet,然後執行dotnet xxxx.dll

請注意,要需分大小寫!要需分大小寫!要需分大小寫!一開始我沒注意大小寫,結果一直提示要裝sdk,害我以為不能只裝runtimes,害我查了好多資料

dotnet xxxx.dll //一定要注意大小寫  

出現以上畫面,你就成功了,如果有誤,你先在你本地window下dotnet  xxx.dll看看有沒有錯誤,一般在你本地上沒問題,在伺服器也是沒問題的。

對了,第一次執行時還出現什麼XML的提示,不太懂,第二次執行就沒有了。

 

請注意,現在外網還不能訪問你的5000埠的,為什麼?

第一,看我上面的listening on http://localhost:5000,我這個dotnet預設只監聽本地的5000埠,所以外網無法訪問,解決方法就是在命令後面加上引數urls

dotnet xxxx.dll --urls http://*:5000 

 

第二 Centos的防火牆預設是開啟的,所以埠還得把防火牆關了,或在防火牆裡添加個埠

//以下操作二選一
systemctl status firewalld // 檢視防火牆狀態 systemctl stop firewalld //關閉防火牆 firewall-cmd --zone=public --add-port=5000/tcp --permanent // permanent引數是永遠存在,不然的話,重啟後就沒有了
firewall-cmd --reload // 重啟防火牆 ,新增埠後記得執行此命令

一般來說,現在就你可以通過外網地址加5000的埠訪問你的網站了。

 

安裝Nginx

https://www.cnblogs.com/songxingzhu/p/8568432.html 

我主要是參考這個部落格,用的是yum安裝,非常簡單,網上有其它很多rpm的安裝方法,比較麻煩,對於這個yum跟rpm的關係,我理解yum是網上應用商城,rpm是本地的軟體管理系統。具體的也不太清楚。

//以下第一句是給你的centos安裝一個yum源,因為nginx沒有yum的源,我的理解就是nginx沒在yum的應用商城上釋出
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm yum install -y nginx //這句才是真正的安裝nginx
systemctl start nginx //啟動nginx,就是這麼簡單
systemctl enable nginx //將nginx設為開機啟動

 有沒感覺這個跟安裝net core執行庫差不多,先rpm再yum。

 

現在用下你外網的地址訪問下,nginx預設有開啟一個80埠的服務了,如下圖,(記得把防火牆關了或新增一個開放80的埠)

接下來把我的vue網站上傳伺服器上,我放在/var/www/vue 目錄下,建議不要放在root下面,會涉及一些許可權問題,還有SElinux,導致403錯誤

 

然後在linux上切換到nginx的配置目錄 

cd /etc/nginx

 如上圖所示,nginx.conf是主配置檔案,開啟這個檔案,下面有一句include /etc/nginx/conf.d*.conf,說明還有一些配置在conf.d目錄裡面,而我們主要要設定的都在conf.d裡面

進到conf.d目錄裡,看到裡面就一個default.conf檔案

vi default.conf  //用vi編輯default.conf檔案

如下圖所示,主要把80埠改成1001埠,把 / 對應的網站目錄改成vue的目錄,匹配 /api 跟 /swagger 轉發到 http://localhost:5000,就是我dotnet的網站

儲存後,記得nginx -t,檢查一下,比如我上圖中proxy_pass中有一個字元打錯了,它就會提示

 

然後重啟下nginx

nginx -s reload  //重啟nginx

然後用外網加埠1001訪問一下,發現彈出錯誤了,也說明了進行我的vue網站了,這個錯誤是後端介面沒有開啟。

 

 

 切換到dotnet 目錄,dotnet xxx.dll 執行起來,再重新整理一下,又彈出錯誤了,錯誤跟上次不同,說明成功訪問我後端介面了,只是現在mysql還沒裝。

 

安裝Mysql

 安裝的步驟跟安裝nginx差不多,

到這裡http://repo.mysql.com/找相關的rpm包,要用yum安裝的話,找名稱後面帶noarch的,裡面有好多rpm包,同個版本還分什麼el、fc,這個我不太懂,但網上我看別人都是裝el,那我就選個el7-11的,如下圖

 

先切換到家目錄 cd ~,先下載上面的rpm包到本地

wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm

你可以看到已經下載到你的家目錄了

然後步驟就跟安裝net core執行庫、nginx差不多了,先rpm,再yum

rpm -ivh mysql57-community-release-el7-10.noarch.rpm  
//我發現也可以用 yum install -y mysql57-community-release-el7-10.noarch.rpm,yum一樣有安裝功能
yum install -y mysql-server  //這句才是安裝mysql,-y是全程yes,不用提示
systemctl start mysqld  //啟動mysql服務,注意,是mysqld,有個d
systemctl enable mysql //將mysql設為開機啟動

這樣Mysql資料庫就已經安裝好了,接下來還得進行Mysql的配置
grep password /var/log/mysqld.log //先檢視資料庫的初始密碼,記得複製下來
mysql -u root -p //然後登入mysql,輸入剛才檢視到的初始密碼
set password for 'root'@'localhost' = password('newPassword!');//登入後,先重置密碼,mysql預設的密碼策略有點複雜,要大小寫數字,還要8位以上

//可以先操作以下命令關閉密碼複雜策略,再修改密碼,
show variables like 'validate_password%'; //檢視mysql關於密碼的配置
set global validate_password_policy=0; //將密碼策略改成低階,就只檢查長度,不強制要求大小寫
set global validate_password_length=1; //將密碼長度改成1位

//建立一個遠端登入使用者,因為我要在外網用navicat for mysql軟體連線
grant all privileges on 資料庫名.表名 to 建立的使用者名稱 @"%" identified by "密碼"; // 資料庫名.表名 如果寫成*.*代表授權所有的資料庫,%代表可以從任何地址登入

如 grant all privileges on *.* to caijt@"%" identified by "123456";

//記得你asp.net core程式裡是用什麼賬號密碼訪問mysql的,就得設定成什麼。

以下為mysql的一些相關配置檔案路徑:
配置檔案:/etc/my.cnf
日誌檔案:/var/log//var/log/mysqld.log
服務啟動指令碼:/usr/lib/systemd/system/mysqld.service
socket檔案:/var/run/mysqld/mysqld.pid

我順便把mysql的預設字符集設定為utf8

然後 systemctl restart mysqld重啟一下mysql,登入mysql後用show variables like '%character%' 檢視mysql的預設字符集

 

然後我就可以在我的電腦上用navicat for Mysql進行連線了,對了,記得把防火牆關了,或者給防火牆加個3306的埠

 

然後在Navicat for Mysql把資料庫進行恢復下,這些都很容易操作了。

資料庫弄好後,到dotnet目錄下dotnet  xxx.dll執行asp.net core 程式,然後再重新整理一下外網地址,發現頁面出來了,登入訪問,一切正常

 

發現有些附件上傳會出錯,發現是附件大小超過1M就上傳不了,那可以到nginx配置檔案進行配置一下

限制最大上傳20m,然後重啟下nginx

 

 

我本來一切都完美收廠時,我發現一個問題,我是用putty連線伺服器,我把putty關了後,dotnet也就關了,其實在之前除錯時,我也發覺這個dotnet得一直佔用視窗很不方便,想用別的命令時,還得把ctrl+c停下來後再打命令,那麼有什麼辦法能把dotnet也變成一個像mysql,nginx一樣的後臺服務呢。

 有兩種方法可以解決

第一種:

微軟官方提供的https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2#monitor-the-app,把dotnet建立成一個服務,就可以用systemctl來管理了

[Unit]
Description=ItSysService

[Service]
WorkingDirectory=/var/www/dotnet
ExecStart=/usr/bin/dotnet /var/www/dotnet/ItSys.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

以上是我寫的服務,儲存在/etc/systemd/system/itsys.service,然後通過systemctl管理

systemctl enable itsys.service //設定為開機啟動
systemctl start itsys.service //開啟服務

 

第二種:

https://my.oschina.net/lichaoqiang/blog/1861791

參考以上部落格,用Supervisor守護程序,這也是之前微軟官方推薦的

 

然後把伺服器相關的埠新增到防火牆,再啟動防火牆。

好了。終於完美收工了。