歷程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差不多,
先切換到家目錄 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的,就得設置成什么。
然后 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守護進程,這也是之前微軟官方推薦的
然后把服務器相關的端口添加到防火牆,再啟動防火牆。
好了。終於完美收工了。



