一、前言
這篇文章我們將講解如何將ASP.NET Core 程序部署到Linux。這里我們使用的是虛擬機里面安裝的Centos7。這里的ASP.NET Core程序,以上篇文章中發布的框架依賴文件為例進行講解。
二、安裝運行時環境
1、在線安裝
我們只是在Linux系統上面部署應用程序,所以只需要安裝ASP.NET Core Runtime即可。在安裝.NET之前,我們需要先注冊Microsoft密鑰和源,在終端里面執行下面的命令:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
更新可供安裝的產品:
sudo yum update
如下圖所示:
最后安裝ASP.NET Core 運行時
sudo yum install aspnetcore-runtime-3.1
如下圖所示:
這時就比較考驗網速了,如果網速比較快,安裝就很快。安裝完成以后查看當前環境:
參考微軟官方文檔:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-package-manager-centos7
2、離線包安裝
如果Linux虛擬機可以連接外網,建議使用上面的方式直接進行安裝,如果是在生產環境下該如何安裝Runtime呢?下面我們使用微軟提供的離線安裝包進行安裝。首先下載tar.gz的離線包,下載網址:
https://dotnet.microsoft.com/download/dotnet-core/3.1
這里選擇Linux對應的架構的離線包下載:
我們首先在Linux上創建一個目錄:
mkdir -p /var/lib/dotnet
如下圖所示:
創建完成以后,我們使用Xftp把上面下載的tar.gz離線包上傳到剛才創建的目錄中:
進入剛才創建的目錄,然后把tar.gz文件解壓到目錄中:
tar zxf aspnetcore-runtime-3.1.1-linux-x64.tar.gz -C /var/lib/dotnet
如下圖所示:
然后執行下面的命令設置環境變量:
export DOTNET_ROOT=/var/lib/dotnet export PATH=$PATH:/var/lib/dotnet
如下圖所示:
然后檢查環境:
可以看到Runtime已經安裝成功了。
注意:這種設置環境變量的方式只對當前會話窗口起作用,在另外的會話窗口就不起作用了,如下圖所示:
為了解決這個問題,我們需要創建軟鏈接方式來設置環境變量。
ln -s /var/lib/dotnet/dotnet /usr/local/bin
如下圖所示:
創建完軟鏈接以后,就可以在所有會話窗口訪問了:
如果是使用在線rpm的方式進行安裝,不會出現這種問題,所有的會話窗口都可以訪問。
三、上傳文件
環境安裝完成以后,我們將發布好的文件上傳到服務器。
在終端里面新創建一個文件夾,用來存放我們上傳的文件:
sudo mkdir /NetCoreDemo
如下圖所示:
創建完成以后我們在XFtp里面查看新創建的文件夾:
可以看到文件夾已經創建成功了。接着我們使用Xftp將文件上傳到剛才創建的文件夾下面:
接下來我們就可以部署了。
三、部署
1、使用Kestrel啟動
我們進入文件夾里面,然后直接使用命令行啟動:
可以看到服務以及啟動了。我們在網頁中瀏覽:
網頁沒有任何的輸入,這是為什么呢?因為localhost是內網地址,這里要加上--urls參數,
dotnet AspNetCoreDeployDemo.dll --urls http://*:5000
如下圖所示:
這時我們在訪問網頁:
發現還是不能訪問,這又是什么原因呢?原來在Linux中防火牆默認是開啟的,所以要想外網訪問,還需要關閉防火牆或者是把5000端口添加到防火牆中,查看防火牆狀態命令:
service firewalld status
如下圖所示:
可以看到,現在防火牆是開啟的,我們把5000端口添加到防火牆中:
firewall-cmd --zone=public --add-port=5000/tcp --permanent
如下圖所示:
permanent:這個參數表示永久存在,否則重啟防火牆配置就丟失了。
添加了端口以后需要重啟防火牆:
firewall-cmd --reload
如下圖所示:
可以看到這時就可以訪問了。
我們也可以關閉防火牆:
service firewalld stop
如下圖所示:
在生產環境中,不建議關閉防火牆,建議是開啟防火牆,然后把相應的端口號添加到防火牆里面。
2、使用Nginx作為反向代理
上面我們是使用的控制台的方式啟動的,這種方式不能處理反向代理,負載均衡等,所以我們建議在Linux上面使用Nginx作為反向代理服務器。我們安裝Nginx。
因為默認情況下,Nginx不在CentOS的資源庫中,首先要執行下面的命令將Nginx添加到資源庫中:
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
如下圖所示:
然后就可以安裝Nginx了:
yum install nginx
如下圖所示:
安裝完以后啟動Nginx:
systemctl start nginx
如下圖所示:
將Nginx設置為開機啟動:
systemctl enable nginx
Nginx默認開啟80端口,我們要把80端口添加到防火牆中,添加完以后重啟防火牆:
firewall-cmd --zone=public --add-port=80/tcp --permanent
如下圖所示:
這時我們在外網訪問Nginx:
我們看到這時可以訪問Nginx了。接下來我們配置Nginx的反向代理。
首先進入Nginx的安裝目錄,然后查看所有文件:
如上圖所示,nginx.conf是主配置文件,使用vim編輯器打開該文件:
在上圖中可以發現:下面有一句include /etc/nginx/conf.d/*.conf,這說明還有一些配置在conf.d目錄里面,而我們配置反向代理,主要就是在conf.d文件里面,使用下面的命令進入conf.d命令:
cd conf.d
然后查看所有文件:
發現里面有一個default.conf的文件,使用Vim編輯器打開該文件,然后修改如下:
listen表示監聽的端口,這里是80端口。proxy_pass用來設置代理的地址。注意這里不要忘記最后的“;”。
保存以后使用下面的命令檢查修改是否正確:
這說明修改的文件沒有錯誤。配置成功以后,我們需要重啟Nginx服務:
nginx -s reload
如下圖所示:
重啟之后我們訪問:
這說明有錯誤,提示信息告訴我們查看Nginx日志,我們在nginx.conf里面查看日志路徑:
然后我們進入該路徑,查看下面的所有文件:
發現這下面有兩個日志,我們先查看error.log:
使用下面的命令解決:
setsebool -P httpd_can_network_connect 1
我們重新訪問:
這就可以訪問了。我們在Linux上面部署就成功了。