1. 程式人生 > >CentOS7上部署ASP.Net Core 2.2應用

CentOS7上部署ASP.Net Core 2.2應用

margin 1-1 顯示 ase vim exec cst 自動運行 color

前言

  在CentOS7上部署ASP.Net Core應用是我的技術路線驗證的一部分,下一個產品計劃采用ASP.Net Boilerplate Framework開發。因此需要求提前進行一下技術驗證,在這次驗證過程中采坑較多。所以決定對采坑過程做一個仔細記錄,以便今後備查。

ASP.Net Core部署CentOS7的必備條件

  如果你的CentOS7是最小安裝模式安裝的,那麽在部署ASP.Net Core應用前,需要為CentOS7安裝以下功能模塊。

  1. Wget功能包
  2. Nginx服務
  3. yum功能包
  4. ASP.Net Core運行環境
  5. lsof功能包

  同時建議你最好準備一個FTP工具,這樣在上傳ASP.Net程序時比較方便。推薦使用Xshell+Xftp這套組件,可以方便實現SSH管理與文件上傳功能。同時這套軟件還對家庭及學校提供免費版本。

通過應用發布和復制

  應用發布可以使用DotNet SDK中的dotnet命令進行發布,也可以通過Visual Studio進行發布。在發布前先要了解發布中的兩個發布的概念,“框架依賴”和“獨立”。如果你部署的服務器上沒有安裝ASP.Net Core Runtime,那麽你可以選擇“獨立模式”,如果已經部署了ASP.Net Core Runtime,使用“框架依賴”模式。“獨立”模式就是打包了ASP.Net Core Runtime的應用程序。但從性能角度來說“框架依賴”的性能更高。

  1. 使用Visutal Studio發布ASP.Net程序,選擇中要發布的項目,右鍵-》選擇發布。
    技術分享圖片
  2. 進發布管理功能界面,可以參賽過“配置”按鈕對發布參數進行調整。
    技術分享圖片
  3. 如果要修改發布位置及發布模式,可以單擊“配置”按鈕。
    技術分享圖片
    調整參數後,保存設置。

  4. 配置確認後,即可發布應用了。

    技術分享圖片

配置反向代理服務器

  在Linux上運行的ASP.Net Core應用是通過Kestrel服務器解析與處理的,但因為Kestrel服務器的安裝性與重寫功能都不是很完善。因此通常我們需要將Apache或Nginx配置為反向代理服務器來為Kestrel提供服務。這裏需要補充一點Kestrel服務器是ASP.Net Core Runtime的一部分,並不需要單獨安裝。這裏也要說一下,使用反向代理服務器的好處。 反向代理服務器可以卸載 HTTP 服務器的工作負載,如提供靜態內容、緩存請求、壓縮請求和 HTTPS 終端。 反向代理服務器可能駐留在專用計算機上,也可能與 HTTP 服務器一起部署。如果只需要反向代理服務,推薦使用Nginx作為反向代理服務器。Nginx本身就是為反向代理服務而開發的,其實代理性能及資源消耗上都比Apache小得多。如果你的服務器資源比較緊張,那麽Nginx是不二的選擇。但如果你面要在服務器上提供PHP服務的話,那麽還是使用Apache服務器更好一點。Apache對於PHP支持更簡單一些。

  在CentOS7上安裝Nginx有兩種方法,一種是使用yum進行安裝,別一種是從官方下載Nginx服務器壓縮包,手動安裝。推薦使用yum進行安裝,但CentOS7本身的資料庫中是沒有Nginx服務器包的,因此如果你需要在CentOS7上部署Nginx的話,更新服務器上的yum源。最近Nginx官方yum源“http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm”。

  1. 添加源
    sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  2. 安裝Nginx前,可以通過“yum search nginx”命令查看源是否已經添加成功。如果已經成功則執行以下命令。

    sudo yum install -y nginx
  3. Nginx安裝成功後需要先修改nginx.conf & default.conf配置文件才能保證Nginx可正確啟動。可以對通過“vim /etc/nginx/nginx.conf”命令來打開文件。
    技術分享圖片
    註:使用“I”啟動“插入”模式,修改完成後使用“:wq”命令進行保存。

  4. 使用“vim /etc/nginx/conf.d/default.conf”命令打開默認配置文件,使用以下內容替換文件全部內容。

    server {
        listen        80 default_server;
        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;
        }
    }
  5. 配置文件修改完成後,選擇使用“nginx -t”命令驗證配置文件是否正確。如果看到以下結果即代表配置文件修改正確。
    技術分享圖片

  6. 啟動Nginx並設置開機自動運行
    sudo systemctl start nginx.service
    sudo systemctl enable nginx.service

    註:如果在啟動Nginx過程中出現端口占用問題,可以先使用“lsof -i :80"命令查看占用端口的應用,然後通過”kill [pid]“命令殺掉相應的進程。然後再重新啟動Nginx。如果遇到”找不到nginx.pid“的問題,可通過在/etc/nginx/目錄下運行nginx即可。

安裝ASP.Net Core運行環境

  如果不需要在服務器上開發的話,是不需要安裝ASP.Net Core SDK的,只需要安裝ASP.Net Core Runtime即可。當前最新的發布版本是.Net Core 2.2,下載地址:https://dotnet.microsoft.com/download/dotnet-core/2.2。
  技術分享圖片

  選擇Linux版本的完整包選項後,再選擇CentOS對應的版本。

  技術分享圖片

  按照說明執行即可,執行過程中詢問過程時選擇”y“。

上傳本地發布的應用

  在這時就要用到一開始提到的FTP工具,通常應用都部署以/var目錄中。在var目錄中新建/www/cdpmapp/目錄 ,並使用FTP將本地發布的應用上傳至此處。

  技術分享圖片

  文件上傳完成後,在應用程序目錄中運行”dotnet <app_assembly.dll>“測試應用,看到以下信息即代表應用可正常啟動。

  技術分享圖片

  測試應用完成後,請在命令提示符處按Ctrl+C關閉應用。

防火墻配置及安全配置

  1. 配置防火墻,打開80端口,並應用配置。
    sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
    sudo systemctl restart firewalld

  2. 關閉SELinux ,使用getenforce 查詢

    臨時關閉(不用重啟機器):

          setenforce 0 ##設置SELinux 成為permissive模式

          ##setenforce 1 設置SELinux 成為enforcing模式

        修改配置文件需要重啟機器:

          修改/etc/selinux/config 文件

          將SELINUX=enforcing改為SELINUX=disabled

          重啟機器即可。

監視應用

  服務器設置為將對 http://<serveraddress>:80 發起的請求轉接到在 http://127.0.0.1:5000 中的 Kestrel 上運行的 ASP.NET Core 應用。 但是,未將 Nginx 設置為管理 Kestrel 進程。 systemd 可用於創建服務文件以啟動和監視基礎 Web 應用。 systemd 是一個 init 系統,可以提供用於啟動、停止和管理進程的許多強大的功能。

  建議在使得記錄本或UltraEdit創建服務定義文件,以下是一個事例文件。  

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/var/www/cdpmapp
ExecStart=/usr/bin/dotnet /var/www/cdpmapp/cdpmapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

  Linux 具有區分大小寫的文件系統。 將 ASPNETCORE_ENVIRONMENT 設置為“生產”會導致搜索配置文件 appsettings.Production.json,而不是 appsettings.production.json。

  保存該文件並啟用該服務

sudo systemctl enable kestrel-helloapp.service

  啟用該服務,並確認它正在運行。

sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service

● kestrel-helloapp.service - Example .NET Web API App running on Ubuntu
    Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
    Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-helloapp.service
            └─9021 /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

  在配置了反向代理並通過 systemd 管理 Kestrel 後,Web 應用現已完全配置,並能在本地計算機上的瀏覽器中從 http://localhost 進行訪問。 也可以從遠程計算機進行訪問,同時限制可能進行阻止的任何防火墻。 檢查響應標頭,Server 標頭顯示由 Kestrel 所提供的 ASP.NET Core 應用。

技術分享圖片

CentOS7上部署ASP.Net Core 2.2應用