CentOS7+Nginx 部署 .Net Core Webapi


1-首先你首先要整一台CentOS7雲服務器是吧(簡單粗暴)

 cat /etc/redhat-release 查看當前服務器版本信息

2.1 添加.NET相關

為了安裝.NET,需要注冊微軟簽名密鑰和添加微軟相關的支持。這個操作每台機器只能做一次。

打開命令行,輸出以下命令,注冊Microsoft需要的依賴環境;:
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc">/etc/yum.repos.d/dotnetdev.repo'

2.2 安裝.NET Core Runtime(其實如果你直接在linux開發程序,是不需要安裝SDK的)

①更新可用的安裝包:sudo yum update

②安裝.NET需要的組件,libunwind和libicu庫:sudo yum install libunwind libicu

③安裝runtime 命令:sudo yum install aspnetcore-runtime-3.1

④檢測是否安裝成功 命令:dotnet --info 

 這樣子就代表runtime安裝成功了.

3.使用VS2019發布Asp.net Core WebApi (這里只是用了Webapi模板程序)

①創建webapi Demo項目

 

 

② 發布Webapi 到本地文件夾

項目右鍵-》發布=》選擇發布的文件夾 =》點擊發布

③ 通過ftp工具 並上傳到CentOS 自定義的發布文件夾中

備注:我這里是用的 Xshell配套的 xftp上傳的(xftp去申請個人版是免費的的)

4.配置Nginx代理

(這里nginx代理了80端口,用戶訪問80端口,nginx轉發到服務器內部的5000端口。這樣目的是可以防止服務器端口直接暴露出來,相對安全一點)

4.1 准備工作

① yum install epel-release (安裝CentOS的 EPEL倉庫)

② yum install nginx (安裝Nginx)

③ systemctl start nginx (啟動Nginx)

systemctl enable nginx(默認啟動Nginx)

⑤查看firewall 狀態, 並啟動防火牆:
yum install firewalld   (安裝)

systemctl status firewalld  (查看防火牆狀態)

systemctl start firewalld  (啟動防火牆 執行下面的⑥中命令一定要先開啟防火牆)

⑥使用如下命令, 允許HTTP和HTTPS通過防火牆:

firewall-cmd  --permanent --zone=public --add-service=http      //允許HTTP

firewall-cmd  --permanent --zone=public --add-service=https    //允許HTTPS

firewall-cmd  --reload 

firewall-cmd --list-ports  //查看開放的端口

⑦在瀏覽器地址欄輸入你服務器的IP地址 如果出現如下路徑頁面 /usr/share/nginx/html/index.html 代表成功

4.2 修改Nginx的配置文件,並自定義配置文件

① vi /etc/nginx/nginx.conf (編輯nginx默認配置文件)  注釋掉server的部分

② 自定義Nginx配置文件xxxx.conf (名字可以自己取)

server {
	listen 80;
	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;
    }
} 

保存后上傳到 /etc/nginx/conf.d 目錄下,然后重啟Nginx 命令:nginx –s reload   或者 systemctl reload nginx.service

驗證Nginx是否重啟成功,命令: systemctl status nginx.service ( 查看nginx狀態)

這里總結一下 nginx相關命令:

yum install nginx (安裝Nginx)

systemctl start nginx.service systemctl start nginx  (開啟nginx )

systemctl status nginx.service (查看nginx狀態)

systemctl reload nginx.service (重啟nginx)
systemctl stop nginx.service (關閉nginx)

4.3 將Nginx添加到SELinux白名單 (SELinux是Security Enhanced Linux的縮寫)

 ①修改SELINUX狀態

vi /etc/selinux/config  將該字段由false改成 enforcing,特別注意改完之后需要重啟,我用的是reboot命令

 

重啟完后輸入 getenforce 命令,如果顯示Enforcing 代表生效

 

 ②使用如下命令, 將Nginx添加至SELinux白名單,依次執行以下命令

yum install policycoreutils-python
cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M  mynginx
semodule -i mynginx.pp

③ 進入到 步驟 3-③  中的文件夾執行命令 dotnet WebapiTest1.dll

 

 

 你看執行后的結果是不是和我們在VS2019控制台一樣的,接下來我們瀏覽器輸入Demo提供的默認api驗證一下

接口地址:http://你的服務器IP:80/WeatherForecast (因為我們在4.2- ②步驟中nginx配置監聽端口是80)

 

你不是奇怪為啥了瀏覽器只有ip沒有端口號,因為只輸入ip的話默認訪問80端口。

如果你想要nginx代理別的端口只需要在4.2- ②步驟中改這個端口就行,不過開啟了防火牆的話,你可能需要在你雲服務器后台加一個下行規則,去開放端口。

 

 還有一個問題要注意:.netcore 默認走的是https即使你輸入http也會轉成https 所以你得在core的pipeline管道配置中把 https重定向中間件暫時去掉 (Startup的 Configure方法中)

后續如果為了api安全起見公司強制走https 就只能去申請證書了。這一部分我還沒驗證,只是提供一個思路。

5. 配置守護進程Supervisor

but ! 你有沒有發現當我們手動部署時,我們無法在頁面進行別的操作。一旦我們命令行工具關閉了,發布的程序就不再訪問了。這時候Supervisor就登場了(原理自己百度)

①安裝Supervisor,兩條命令

yum install python-setuptools

easy_install supervisor

② 配置Supervisor

mkdir /etc/supervisor

echo_supervisord_conf > /etc/supervisor/supervisord.conf  (為Supervisor生成默認的配置文件)

vi /etc/supervisor/supervisord.conf (進入文件修改一些配置)

(1)將這三個文件路徑修改,原來是在tmp文件夾下由於(tmp文件夾是臨時文件夾linux可能會刪除掉,不方便我們看一些日志信息)

(2)將nodaemon改成true,這一步目的是當我們重啟系統時,supervisor也能自啟動

 (3)這一步的目的是當supervisor啟動時會自動加載supervisored.d 文件夾下的所有 ini文件

 (文件最后一行)

③ 新建supervisord.service文件 拷貝至 /usr/lib/systemd/system 路徑下

# dservice for systemd (CentOS 7.0+)# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Process Monitoring and Control Daemon
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

④ 為我們部署的WebapiTest1添加進程配置文件 WebapiTest1.ini (名字自取)

[program:WebapiTest1]
command=dotnet WebapiTest1.dll --urls http://*:5000 ; 運行程序的命令
directory=/root/TestApi ; 命令執行的目錄
autorestart=true ; 程序意外退出是否自動重啟
stderr_logfile=/root/TestApi/Log/WebapiTest1.err.log ; 錯誤日志文件
stdout_logfile=/root/TestApi/Log/WebapiTest1.out.log ; 輸出日志文件
environment=ASPNETCORE_ENVIRONMENT=Development ; 進程環境變量
user=root ; 進程執行的用戶身份
stopsignal=INT

保存成功后,移動到supervisord.d文件夾。

 

⑤啟動supervisord

systemctl enable supervisord.service

systemctl start supervisord.service  或 supervisord -c /etc/supervisor/supervisord.conf

ps aux | grep supervisord  /  ps aux | grep WebapiTest  

執行這兩條命令驗證,證明啟動成功接下來訪問接口是否能訪問到數據。(如下圖所示,接口能訪問到數據)

 

 

⑥ supervisord 相關命令總結

systemctl status supervisord.service  (查看supervisord進程狀態)
systemctl enable supervisord.service
systemctl start supervisord.service  (啟動)
systemctl restart supervisord.service (重啟,當我們改了相關配置文件時,重新加載配置)
systemctl stop supervisord.service (關閉)

5. 驗證SuperVisor

1-WebapiTest1意外關閉是否能夠被Supervisor重新拉起運行 (驗證成功)

2-啟動重啟后能否自啟動Supervisor (驗證成功)

6. 補充內容

其他linux命令參考:

find / -name supervisor.sock 

unlink /run/supervisor.sock 

ps aux | grep supervisord   通過進程名查看進程狀態

cat /var/log/supervisord.log 查看文件

cat -n /var/log/supervisord.log 行號查看
: > /var/log/supervisord.log 清空文件
kill 2020(pid)  通過pid結束進程

ip端口測試命令:

ping IP /  測試IP、端口:telnet IP Port

參考:
https://blog.csdn.net/tangmou_ren/article/details/83657294
https://my.oschina.net/u/3772973/blog/4626133
https://blog.csdn.net/binggoogle/article/details/53203991

https://blog.csdn.net/u014729212/article/details/101288635

說明: 如果給您帶來了誤導請在評論區指出,相互交流交互進步。郵箱交流也可以 16620834081@163.com   over...


免責聲明!

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



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