前言:
本篇文章主要講解的是如何在Linux CentOS7操作系統搭建.NET Core運行環境並發布ASP.NET Core應用程序,以及配置Nginx反向代理服務器。因為公司的項目一直都是托管在Window服務器IIS上,對於Linux服務器上托管.NET Core項目十分好奇。因為好奇,因此就有了這篇文章關於如何在Linux CentOS7系統中配置.NET Core運行環境,部署項目和反向代理服務器的配置。
一、開發工具介紹
Xshell:
是一個強大的安全終端模擬軟件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 協議。Xshell 通過互聯網到遠程主機的安全連接以及它創新性的設計和特色幫助用戶在復雜的網絡環境中享受他們的工作。
Xftp:
是一個功能強大的SFTP、FTP 文件傳輸軟件。使用了 Xftp 以后,MS Windows 用戶能安全地在 UNIX/Linux 和 Windows PC 之間傳輸文件。Xftp 能同時適應初級用戶和高級用戶的需要。它采用了標准的 Windows 風格的向導,它簡單的界面能與其他 Windows 應用程序緊密地協同工作,此外它還為高級用戶提供了眾多強勁的功能特性。
當然這兩個工具提供了非商業用途的免費使用權限,你只需要填寫對應的信息即可。
下載地址:https://www.netsarang.com/en/free-for-home-school/
二、.NET Core環境搭建
環境下載地址:https://dotnet.microsoft.com/download
查看操作系統版本:
lsb_release -a
Install .NET Core SDK【安裝.Net Core SDK】:
概述:.NET Core SDK 是一組庫和工具,開發人員可用其創建 .NET Core 應用程序和庫。
它包含以下用於構建和運行應用程序的組件:
.NET Core CLI 工具。
.NET Core 庫和運行時。
DotNet 驅動程序(https://docs.microsoft.com/zh-cn/dotnet/core/tools/index?tabs=netcore2x#driver)。
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-2.2
官網最新安裝教程:
https://dotnet.microsoft.com/download/linux-package-manager/centos7/sdk-current
查看安裝環境版本信息:
dotnet --info
三、項目發布並部署到CentOS服務器中
使用Visual Studio發布項目:
部署方式選擇框架依賴
原因:因為前面我們已經安裝好了.Net Core應用程序運行所需要的運行環境和對應的SDK了。
目標運行時選中可移植的
原因:可以適用所有操作系統。
將發布好的文件使用xftp上傳到服務器:
使用xshell查看項目是否上傳成功:
運行項目:
首先要進入項目目錄:
cd MyDotNetApplication/
運行項目:
dotnet FirstCore.dll -d &
查看后台是否能夠運行:
wget http://localhost:5000
或者
curl http://localhost:5000
運行程序提示問題:
warn: Microsoft.AspNetCore.Server.Kestrel[0] Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.
出現這個警告的話,IPV6s回送的時候不可達,也就是說你只能夠在服務器內部通過本地訪問,但是無法通過外網ip對網站進行訪問。
解決方法:
首先停止網站: 查看運行程序端口:jobs -l 結束當前程序:kill 端口號 重新運行程序,最后設置如下訪問方式【當然這樣子做只是為了看運行效果,下面我們需要配置Nginx以及守護服務】: dotnet FirstCore.dll --server.urls="http://*:5000"
然后在輸入外網ip+5000端口號進行訪問,訪問成功,頁面如下圖所示:
四、配置Nginx反向代理:
使用反向代理服務器的優勢:
Kestrel 非常適合從 ASP.NET Core 提供動態內容。 但是,Web 服務功能不像服務器(如 IIS、Apache 或 Nginx)那樣功能豐富。 反向代理服務器可以卸載 HTTP 服務器的工作負載,如提供靜態內容、緩存請求、
壓縮請求和 HTTPS 終端。 反向代理服務器可能駐留在專用計算機上,也可能與 HTTP 服務器一起部署。
反向代理服務器接收來自網絡的 HTTP 請求,並將這些請求轉發到 (邊緣服務器)Kestrel,請求流程圖如下所示:
下載、安裝、啟動Nginx命令:
首先添加CentOS 7 EPEL源:
sudo yum install epel-release
(拓展)添加EPEL源的作用:
EPEL(Extra Packages for Enterprise Linux)是由 Fedora 社區打造的、為 RHEL 及其衍生發行版(如 CentOS 等)提供高質量軟件包的項目。安裝了 EPEL 源之后,就像在 Fedora 上一樣,通過“yum install 軟件包名”,即可安裝很多之前需要編譯安裝的軟件、常用的軟件以及一些比較流行的軟件,比如現在流行的 nginx、redis 等。安裝了EPEL源之后,都可以使用 EPEL 很方便的安裝更新。
使用以下yum命令安裝Nginx :
sudo yum install nginx
因為是首次安裝 Nginx,通過運行以下命令顯式啟動:
sudo service nginx start
或者:
sudo systemctl start nginx
查看Nginx是否啟動:
查看Nginx的運行狀態:
systemctl status nginx
用ps -ef列出進程列表,然后通過grep過濾nginx:
ps -ef | grep nginx
設置系統啟動時啟用Nginx:
sudo systemctl enable nginx
查看系統防火牆狀態:
service iptables status
如下圖所示我的防火牆是關閉的:
如果系統中的防火牆未關閉,請輸入以下命令來允許 HTTP 和 HTTPS 通信:
sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload
在瀏覽器中輸入服務器的 IP 地址:http://123.xx.xx.88/來驗證 Nginx 是否成功運行:
如下圖所示能看到 Nginx 的默認轉發網頁則說明Nginx運行成功了:
修改 Nginx 配置文件:
使用Vim命令打開Nginx默認配置:
若要將 Nginx 配置為反向代理服務器用來將請求轉接到 ASP.NET Core 應用,請修改Nginx的默認配置文件 /etc/nginx/nginx.conf 在文本編輯器中打開它,並將內容替換為以下內容:
vim /etc/nginx/nginx.conf
將原server中的默認配置內容替換成以下內容:
替換的內容:
server { listen 80; server_name example.com *.example.com; 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; } }
保存編輯,並退出文本編輯器:
esc+:wq 保存修改並退出vim編輯器
驗證Nginx的默認文件配置是否正確:
nginx -t
查看端口在實例中是否正常被監聽:
netstat -an | grep 80
重啟Nginx:
nginx -s reload
最后直接通過服務器ip地址訪問ASP.NET Core應用程序:
提示502 Bad Gateway:
原因:Linux CentOs中的項目沒有運行!
到對應的項目目錄,運行項目,輸入以下命令: 進入項目目錄: cd MyDotNetApplication/ 運行項目: dotnet FirstCore.dll -d &
再次訪問服務器Ip,項目成功運行:
五、配置Supervisor守護服務:
為什么要配置Supervisor:
使用Linux部署過ASP.NET Core應用程序的小伙伴都清楚,我們在部署項目都是通過Shell進行項目啟動運行的。有時候我們會發現當我們關閉了Shell后,應用程序會立馬宕機無法訪問,需要我們重新進入服務器連接Shell輸入dot命令重啟應用程序。在生成環境中對於這種沒有對應用程序進行任何的守護和監聽的部署是非常的糟糕的,因此我們需要守護服務或者容器(推薦使用Docker)來對應用程序進行監聽保護作用,當監聽到應用進程停止,Supervisor會自動重啟該應用程序。
Supervisor簡單概述:
首先簡單了解下Supervisor, Supervisor(http://supervisord.org/)是用Python開發的一個client/server服務,是Linux/Unix系統下的一個進程管理工具,不支持Windows系統。它可以很方便的監聽、啟動、停止、重啟一個或多個進程。用Supervisor管理的進程,當一個進程意外被殺死,supervisort監聽到進程死后,會自動將它重新拉起,很方便的做到進程自動恢復的功能,不再需要自己寫shell腳本來控制。
安裝Supervisor:
yum install python-setuptools easy_install supervisor
配置Supervisor
//新建指定目錄,為了避免默認配置會在某些更新覆蓋掉 mkdir /etc/supervisor //這里是在新建好的目錄新建conf文件,這里關鍵。默認文件會建立在/etc目錄下 echo_supervisord_conf > /etc/supervisor/supervisord.conf
新建成功如下圖所示:
打開supervisord.conf,要將文件的結尾部分替換掉以便后面能讀取到我們的配置文件
打開supervisord.conf配置文件:
vim supervisord.conf
在文件的結尾找到以下配置代碼:
;[include]
;files = relative/directory/*.ini
將代碼替換為如下,注意前后不能帶 ;和空格符號
[include]
files = conf.d/*.conf
配置對ASP.NET Core應用的守護:
進入目錄 /etc/supervisor/ 新建 conf.d文件夾:
mkdir conf.d
在【/etc/supervisor/conf.d/】目錄下新建一個AspNetCoreWebApi.conf配置文件:
vim AspNetCoreWebApi.conf
直接復制以下內容:
[program:AspNetCoreWebApi]
command=dotnet FirstCore.dll;
directory=/root/MyDotNetApplication/;
autorestart=true;
stderr_logfile=/var/log/AspNetCoreWebApi.err.log;
stdout_logfile=/var/log/AspNetCoreWebApi.out.log;
environment=ASPNETCORE_ENVIRONMENT=Production;
user=root;
stopsignal=INT;
配置說明:
[program:AspNetCoreWebApi] command=dotnet FirstCore.dll; 運行程序的命令 directory=/root/MyDotNetApplication/; 命令執行的目錄 autorestart=true; 程序意外退出是否自動重啟 stderr_logfile=/var/log/AspNetCoreWebApi.err.log;錯誤日志文件 stdout_logfile=/var/log/AspNetCoreWebApi.out.log;輸出日志文件 environment=ASPNETCORE_ENVIRONMENT=Production;進程環境變量 user=root;進程執行的用戶身份 stopsignal=INT
注意:如果服務已啟動,修改配置文件可用“supervisorctl reload”命令來使其生效。
運行supervisord,查看是否生效,命令如下:
supervisord -c /etc/supervisor/supervisord.conf ps -ef | grep AspNetCoreWebApi //AspNetCoreWebApi是上面配置的program名稱:[program:AspNetCoreWebApi]
配置Supervisor開機啟動
新建一個“supervisord.service”文件
[Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
將supervisord.service文件拷貝至:
/usr/lib/systemd/system/ #系統目錄下
執行命令:systemctl enable supervisord #激活開機啟動命令
執行命令:systemctl is-enabled supervisord #來驗證是否為開機啟動
下面是一些常用的 Supervisor 的命令 (參考https://segmentfault.com/a/1190000003955182):
命令 | 說明 |
---|---|
supervisord | 初始啟動Supervisord,啟動、管理配置中設置的進程 |
supervisorctl stop myproject | 停止某一個進程(programxxx),programxxx為[program:chatdemon]里配置的值,這個示例就是chatdemon |
supervisorctl start myproject | 啟動某個進程 |
supervisorctl restart myproject | 重啟某個進程 |
supervisorctl stop groupworker | 重啟所有屬於名為groupworker這個分組的進程(start,restart同理) |
supervisorctl stop all | 停止全部進程,注:start、restart、stop都不會載入最新的配置文件 |
supervisorctl reload | 載入最新的配置文件,停止原有進程並按新的配置啟動、管理所有進程 |
supervisorctl update | 根據最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啟。注意:顯示用stop停止掉的進程,用reload或者update都不會自動重啟 |