天天看點

在 centos 7* 上部署ASP.NET Core 至 完全托管在 centos 7* 上部署ASP.NET Core 至 完全托管

在 centos 7* 上部署ASP.NET Core 至 完全托管

添加dotnet産品Feed

在安裝.NET之前,您需要注冊Microsoft密鑰,注冊産品存儲庫并安裝所需的依賴項。這隻需要每台機器完成一次。

打開終端并運作以下指令:

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

安裝.NET SDK

更新可用于安裝的産品,然後安裝.NET SDK。

在終端中,運作以下指令:

sudo yum update

sudo yum install dotnet-sdk-2.2

檢查所有安裝正确

安裝完成後,打開一個新終端并運作以下指令:

dotnet

若沒報錯,說明安裝成功

建立您的應用

在終端中,運作以下指令:

dotnet new console -o myApp

dotnet new webApp -o myWebApp --no-https

該 console/webApp 參數選擇建立應用時要使用的模闆。

該-o參數建立一個名為myWebApp存儲應用程式的目錄。

該--no-https标志指定不啟用HTTPS。

運作以下指令來運作:

cd myWebApp

dotnet run 

直至出現 http://localhost:5000 說明運作成功

此時仍不能通路,需要部署一個 web 容器來轉發

現在來安裝一個 Nginx

curl -o  nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

rpm -ivh nginx.rpm

yum install nginx

或:

sudo yum install epel-release

sudo yum install nginx

配置防火牆:

sudo firewall-cmd --permanent --zone=public --add-service=http (加入http協定連結)

sudo firewall-cmd --permanent --zone=public --add-service=https(加入https協定連結)

firewall-cmd --zone=public --add-port=80/tcp --permanent(開放80端口)

sudo firewall-cmd --reload(重新開機防火牆使之生效)

ok了

systemctl start/stop nginx 運作和停止nginx

systemctl enable/disable nginx 允許和阻止開機啟動nginx

設定 nginx 反向代理:

vi /etc/nginx/nginx.config

找到:

server {

       ...

}

寫入

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;

         }

}

nginx –s reload    重新加載 nginx

此時運作.NET Core 項目 會發現,仍然無法通路,

因為這是由于 SELinux 保護機制所導緻,此時我們應需要将 nginx 添加至 SElinux 的白名單

運作以下指令:

yum install policycoreutils-python

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

sudo semodule -i mynginx.pp

現在,一切就 over 了

此時,雖然步驟差不多了,但你會發現:

       1. 運作了項目過後,就不能進行其他操作了,需要結束程序,才能操作,這種情況當但是我們不想看到的,而且在生産環境中對這種情況是零容忍的。

       2. 如果 .NET Core 程序意外中止,那麼我們就需要再次啟動,往往,這種操作也不夠及時

       3. 如果伺服器當機或需要重新開機,我們也必須要重新開機項目。

為了解決這個問題,我們需要有一個程式來監聽.NET Core 應用程式的狀況。在應用程式停止運作的時候立即重新啟動。這邊我們用到了Supervisor這個工具,Supervisor使用Python開發的。

安裝 Supervisor

yum install python-setuptools

easy_install supervisor

配置Supervisor

mkdir /etc/supervisor

echo_supervisord_conf > /etc/supervisor/supervisord.conf

vi /etc/supervisor/supervisord.conf

将尾部的:

;[include]

;files = relative/directory/*.ini

改成:

[include]

files = conf.d/*.conf

配置對.Net Core應用的守護: 

touch /etc/supervisor/conf.d/項目名.conf

vi /etc/supervisor/conf.d/項目名.conf

[program:Scorpio.WebApi]                        ;自定義程序名稱
command=dotnet Scorpio.WebApi.dll               ;程式啟動指令
directory=/home/wwwroot/scorpio                 ;指令執行的目錄
autostart=true                                  ;在Supervisord啟動時,程式是否啟動
autorestart=true                                ;程式退出後自動重新開機
startretries=5                                  ;啟動失敗自動重試次數,預設是3
startsecs=1                                     ;自動重新開機間隔
user=root                                       ;設定啟動程序的使用者,預設是root
priority=999                                    ;程序啟動優先級,預設999,值小的優先啟動
stderr_logfile=/var/log/Scorpio.WebApi.err.log  ;标準錯誤日志
stdout_logfile=/var/log/Scorpio.WebApi.out.log  ;标準輸出日志
environment=ASPNETCORE_ENVIRONMENT=Production   ;程序環境變量
stopsignal=INT                                  ;請求停止時用來殺死程式的信号      

supervisord -c /etc/supervisor/supervisord.conf

如果出現了

Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

試試 supervisorctl stop 再輸入,如果不管用就重新開機再輸入接着:

ps -ef | grep 項目名

supervisorctl reload

輸入 supervisorctl

exit 或 Ctrl + c 可以退出 supervisorctl指令模式

看看是否存在 你建立的 項目程序,如有則,運作成功

配置Supervisor開機啟動:

建立一個 supervisord.service

touch /usr/lib/systemd/system/supervisord.service

vi /usr/lib/systemd/system/supervisord.service

寫入:

# dservice for systemd (CentOS 7.0+)

# by ET-CS (https://github.com/ET-CS)

[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

執行指令:

systemctl enable supervisord

執行指令:

systemctl is-enabled supervisord #來驗證是否為開機啟動

如果為enabled則ok了

本文章參考自:https://blog.csdn.net/zhuyu19911016520/article/details/61210489