1. 程式人生 > >.NET Core跨平臺部署

.NET Core跨平臺部署

.NET Core跨平臺部署

1. Windows-IIS

大家對於在IIS上部署.NET站點已經駕輕就熟了,部署.NET Core也沒有什麼本質區別,但是這其中仍然有一些細節是不同的,下面記錄了一些我在部署時遇到的問題

1.1 安裝.NET Core Windows Server Hosting

要在IIS上執行ASP.NET Core,必須安裝.NET Core Windows Server Hosting

安裝完成後最好重啟IIS

如果沒有安裝該元件就直接開啟部署的網站會出現 500.19 相關的配置資料無效

1.2 配置應用程式池

Core的IIS站點應用程式池的.NET CLR版本要選擇 無託管程式碼

選擇無託管程式碼

1.3 使用釋出檔案

我最開始測試的時候,仍然使用Web根目錄作為網站的物理路徑,但是網站無法訪問,報HTTP403錯誤——Web 伺服器被配置為不列出此目錄的內容,也是就是這個資料夾下沒有可以訪問的檔案,在查閱網上的資料後發現其他人都是使用了釋出資料夾作為物理路徑,生成釋出版本設定相應路徑後.NET Core的示例站點即可正常訪問

站點設定

釋出資料夾結構

釋出資料夾結構

成功訪問

成功訪問

2 Linux

微軟官方給出了不同系統的部署方法Tutorial Guide,由於Linux有不同的版本,所以這裡選擇CentOS作為示例,有以下幾個步驟

2.1 新增.NET產品依賴

在安裝.NET之前,你需要註冊微軟的Key,註冊產品倉庫,並且安裝需要的依賴,在每臺機器上只需要做一次。

直接執行以下命令:

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

2.2 安裝.NET SDK

更新可供安裝的產品,然後安裝.NET SDK

輸入以下命令:

sudo yum update
sudo yum install dotnet-sdk-2.2

中間有兩次手動確認,然後等待安裝完成即可

2.3 建立你的應用

通過輸入命令就可以建立一個官方的示例.NET Core程式

dotnet new console -o myApp
cd myApp

第一條命令新建應用,第二條進入應用資料夾

通過 ls 命令我們可以看到該資料夾下只有兩個檔案,obj是資料夾

Linux下的檔案結構

預設的主檔案Program.cs的內容如下:

using System;

namespace myApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

2.4 執行應用

dotnet run

Hello World

2.5 建立web應用

使用mkdir命令新建一個資料夾mvc,然後進入目錄

建立網站

dotnet new mvc

然後釋出這個網站程式

dotnet restore
dotnet publish -c release

預設的釋出目錄是在/bin/release/netcoreapp2.x/publish/裡,可以新建一個目錄拷貝進去

scp -r /root/mvc/bin/release/netcoreapp2.2/publish/* /root/www/firstapp

2.6 從外網訪問web應用

完成釋出後,已經可以通過執行dotnet命令來啟動網站了,但是隻能在內網訪問,顯然這不是我們想要的,要想從外網訪問,我們需要反向代理伺服器,這裡選擇Nginx

使用yum命令遠端安裝

sudo yum install epel-release
yum install nginx

啟動

systemctl start nginx #啟用Nginx
systemctl enable nginx #設定開機啟動

這時候已經可以直接通過伺服器的IP地址的80埠訪問Nginx的測試頁了,需要注意的是如果使用阿里雲伺服器,需要在安全組配置中開放80端口才能夠訪問

接下來根據需要進行一些埠的配置,dotnet預設的訪問埠為5000,但是我測試的時候好像是在linux上被佔用了,所以對 Program.cs 進行修改,使其可以通過其他埠訪問,這裡使用8080

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .UseUrls("http://*:8080")
        .UseStartup<Startup>();
}

改完之後需要重新生成釋出,開始我使用的是微軟官方的示例程式,這裡為了對比埠,我在自己Windows系統下新建了一個2.1的示例程式,使用VS2017進行程式修改,釋出後通過xftp再上傳到Linux伺服器上

然後去修改Nginx的配置,預設的路徑應該是/etc/nginx/nginx.conf,在server節點下的location節點加一句 proxy_pass http://localhost:8080; 就可以

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
            proxy_pass http://localhost:8080;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

修改完成後測試並重啟Nginx服務

sudo nginx -t         #測試配置
sudo nginx -s reload  #重新載入配置

配置完成之後,啟動網站訪問伺服器IP地址的8080埠即可

但是啟動網站這裡存在一個問題,如果像上面那樣沒有使用cd命令進入網站目錄啟動,樣式和指令碼等檔案的路徑就會出現錯誤,導致頁面顯示不正常所以要在網站目錄啟動

基本的網站部署就到這裡,下一次講講用Docker如何進行.NET Core的部署與開發