前言:
本篇文章主要講解的是如何在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都不會自動重新開機 |
作者:追逐時光者
作者簡介:一個熱愛程式設計,善于分享,喜歡學習、探索、嘗試新事物,新技術的程式猿。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果該篇文章對您有幫助的話,可以點一下右下角的【♥推薦♥】,希望能夠持續的為大家帶來好的技術文章,文中可能存在描述不正确或錯誤的地方,歡迎指正、補充,不勝感激 !