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


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

 從壹開始前后端分離【 .NETCore2.1 +Vue 2 +AOP+DI】框架

感謝老張的博客,我對asp.net core入門主要就是靠他的博客了,這里再說一次,微軟的文檔真的太難看了!

 

雖然網上已經有很多關於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是本地的軟件管理系統。而yum如果找不到你需要的包的話,你可以通過給yum增加安裝源(意思就是增加一個提供軟件包的地址,讓yum可以通過這個地址去獲取軟件包),下面第一條命令rpm xxxx的作用就是在/etc/yum/repo.d里面增加一個repo文件。

//以下第一句是給你的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記得關了(到/etc/selinux/config把SELINUX=enforcing改成SELINUX=disable,然后重啟),不然很容易導致403錯誤,還有一些莫名奇妙的問題。

(如果你確實不想關SElinux的話,可以看我另一篇博客 Linux開啟SELinux的情況下怎么解決nginx403跟502錯誤

 

然后在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前端頁面里面彈出了,也說明了進行我的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守護進程,這也是之前微軟官方推薦的

 

然后把服務器相關的端口添加到防火牆,再啟動防火牆。

好了。終於完美收工了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM