CentOS 8 部署 ASP.NET Core 3.1 應用程序


尊重作者勞動成果,轉載請注明出處,謝謝!

1.安裝 CentOS 8

系統下載地址:http://isoredirect.centos.org/centos/8/isos/x86_64/CentOS-8.2.2004-x86_64-dvd1.iso

系統安裝:我采用的是 VMware Workstation 虛擬機來安裝 CentOS 8 操作系統,虛擬機設置:內存 2G 以上,網絡連接使用橋接模式

2.安裝 .NET Core SDK

SDK 安裝:請參照微軟官方文檔 https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos

.NET Core 3.1 在 CentOS 8 的默認包存儲庫中有提供,直接使用下面命令安裝 SDK:

sudo dnf install dotnet-sdk-3.1

安裝完成后,使用 dotnet --info 命令查看是否能正確輸出當前 SDK 信息。

3.部署 ASP.NET Core 應用程序

這里我們使用 3 個相同項目來進行測試,其中 1 個用於測試 nginx 的反向代理功能,另外 2 個用於測試 nginx 的負載均衡功能。第一個項目我們讓它監聽 60001 端口,並且在頁面上輸出“Hello World”,第二、第三個項目我們分別讓它監聽 1000110002 端口,並且在頁面上分別輸出“WebApp1”和“WebApp2”,如下圖所示:

注意:在生產環境中可以通過在 appsetting.Production.json 配置文件的 urls 配置節來指定監聽的端口,例如:"urls":"http://*:10001"。

使用 WinSCP 或 XFTP 等工具將編譯好的程序上傳到 CentOS 指定的目錄中,然后使用 dotnet 命令測試是否能成功運行。

4.安裝 nginx

4.1 安裝 nginx

步驟1:安裝 nginx

sudo dnf install nginx

步驟2:啟動 nginx

systemctl start nginx

步驟3:設置開機自啟

systemctl enable ngix

4.2 配置 nginx

nginx 默認的配置文件為 /etc/nginx/nginx.conf ,我們可以在 /etc/nginx/conf.d 文件夾中新增一個 WebApp.conf 配置文件,文件內容如下所示:

# 項目1 
server { listen 50001; server_name localhost; location / { proxy_pass http://localhost:60001; 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; } } # 項目2、3 upstream WebApp { #ip_hash; #解決session問題 server localhost:10001 weight=1; #weight為權重 server localhost:10002 weight=2; } server{ listen 12345; #nginx服務監聽的端口 server_name localhost; location / { proxy_pass http://WebApp; 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; } }

測試配置:

nginx -t

重新啟動:

nginx –s reload

輸入服務器 IP 地址(默認 80 端口),若看到如下圖所示頁面,則代表 nginx 安裝並配置成功。

5.啟用防火牆

查看防火牆狀態:

systemctl status firewalld

啟動防火牆:

systemctl start firewalld

允許 HTTP 和 HTTPS:

firewall-cmd  --permanent --zone=public --add-service=http 
firewall-cmd  --permanent --zone=public --add-service=https

開放 80 、50001(用於項目 1 的反向代理)、12345(用於項目 2、3 負載均衡) 端口:

firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=50001/tcp
firewall-cmd --permanent --zone=public --add-port=12345/tcp

重啟防火牆:

firewall-cmd  --reload

注意:每次對防火牆的修改,需要進行重啟才能生效。

6.SELinux 白名單

步驟1:修改 SELinux 的狀態

打開 /etc/selinux/config 文件,將 SELINUX=disabled 改為 SELINUX=enforcing ,隨后使用 getenforce 命令,如果輸出的值為 Enforcing,則代表修改成功

步驟2:將 nginx 添加至 SELinux 白名單,依次執行以下命令:

yum install policycoreutils-python

cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M NginxToSELinux semodule -i NginxToSELinux.pp

7.反向代理與負載均衡

我們依次使用 dotnet 命令啟動上述的 3 個應用程序。首先訪問服務器的 IP 地址和 50001 端口(我這里是 192.168.8.229:50001),我們可以看到如下圖所示的頁面,說明我們成功應用 nginx 作為反向代理服務器:

接着訪問服務器的 IP 地址和 12345 端口(我這里是 192.168.229:12345),我們可以看到第一次訪問得到的頁面如下圖所示:

接着我們刷新該頁面,第二次訪問得到的頁面如下圖所示:

第三次刷新該頁面時,得到的頁面輸出的內容仍然為 “WebApp2”。第四次刷新頁面時,得到的頁面輸出的內容為“WebApp1”(localhost:10001 的權重為 1,localhost:10002 的權重為 2),說明我們成功應用 nginx 的負載均衡功能。

8.守護進程

上面我們是以手動的方式來啟動我們的 ASP.NET Core 應用程序的,接下來我們使用 supervisor 來自動啟動我們的應用程序,並對我們的程序進行守護,如軟件異常退出時 supervisor 會幫助我們自動重啟程序。

步驟1:安裝 supervisor

sudo dnf install epel-release
sudo dnf install supervisor

步驟2:導出配置文件到指定目錄

echo_supervisord_conf > /etc/supervisor/supervisord.conf

步驟3:設置開機自啟

systemctl enable supervisord
systemctl enable supervisord.service

systemctl is-enabled supervisord        #驗證是否開機自啟

打開 /usr/lib/systemd/system/ 路徑下的 supervisord.service 文件,將 ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf 修改為 ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf如下所示:

[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf    # 修改這里的配置文件路徑為步驟2指定的配置文件路徑
RuntimeDirectory=supervisor
RuntimeDirectoryMode=755

[Install]
WantedBy=multi-user.target

步驟4:修改 supervisord.conf 配置文件

;修改 files
[include] files = /etc/supervisor/conf.d/*.ini ;在配置文件中去掉[inet http server]的注釋就可在瀏覽器中使用圖形管理界面 [inet_http_server] ; inet (TCP) server disabled by default port=*:9001 ; (ip_address:port specifier, *:port for all iface) username=user ; (default is no username (open server)) password=123 ; (default is no password (open server))

步驟5:創建 promgram ini 配置文件(以上面 3 個項目為例)

①項目1(頁面輸出 HelloWorld)— WebApp.ini

[program:WebApp]
command=dotnet WebApp.dll  ; 運行程序的命令
directory=/home/WebApp/    ; 對應的你的項目的存放目錄
autostart=true
autorestart=true           ; 程序意外退出是否自動重啟
stderr_logfile=/var/log/WebApp.err.log ; 錯誤日志文件
stdout_logfile=/var/log/WebApp.out.log ; 輸出日志文件
environment=ASPNETCORE_ENVIRONMENT='Production',ASPNETCORE_URLS='http://*:60001' ; 進程環境變量
stopsignal=INT

②項目2(頁面輸出 WebApp1)— WebApp1.ini

[program:WebApp1]
command=dotnet WebApp.dll  ; 運行程序的命令
directory=/home/WebApp1/   ; 對應的你的項目的存放目錄
autostart=true
autorestart=true           ; 程序意外退出是否自動重啟
stderr_logfile=/var/log/WebApp1.err.log ; 錯誤日志文件
stdout_logfile=/var/log/WebApp1.out.log ; 輸出日志文件
environment=ASPNETCORE_ENVIRONMENT='Production',ASPNETCORE_URLS='http://*:10001' ; 進程環境變量
stopsignal=INT

③項目3(頁面輸出 WebApp2)— WebApp2.ini

[program:WebApp2]
command=dotnet WebApp.dll  ; 運行程序的命令
directory=/home/WebApp2/   ; 對應的你的項目的存放目錄
autostart=true
autorestart=true           ; 程序意外退出是否自動重啟
stderr_logfile=/var/log/WebApp2.err.log ; 錯誤日志文件
stdout_logfile=/var/log/WebApp2.out.log ; 輸出日志文件
environment=ASPNETCORE_ENVIRONMENT='Production',ASPNETCORE_URLS='http://*:10002' ; 進程環境變量
stopsignal=INT

在 /etc/supervisor/ 路徑下創建 conf.d 文件夾,並將上述創建好的三個 ini 配置文件移動到 conf.d 文件夾下:

mkdir /etc/supervisor/conf.d

步驟6:指定配置文件啟動 supervisor

supervisord -c /etc/supervisor/supervisord.conf

其他命令:

supervisorctl reload        # 載入最新的配置文件,停止原有進程並按新的配置啟動、管理所有進程
supervisorctl update        # 根據最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啟
supervisorctl start all         # 啟動所有程序
supervisorctl start WebApp    # 啟動單個程序
systemctl status supervisord    # 查看 supervisord 服務狀態 ps -ef|grep supervisord         # 查看是否存在 supervisord 進程

9.常見問題

 


免責聲明!

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



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