【Asp.net Core】在 Linux 子系統中安裝 nginx 並配置反向代理

上一篇鳥文中,老周已經介紹過在 Ubuntu 子系統中安裝 dotnet-sdk 的方法,本文老周給大夥伴們說說安裝 nginx 服務,並配置反向代理。一樣,老周假設你歷來沒有用過 Linux,因此老週會講得很細。可能由於這樣,博客園每次都把老周的文章撤下首頁。無論他,他撤他的,我推個人,Who 怕 Who。html

其實,你能夠選擇 nginx 或 Apache,不過老周更喜歡 nginx 一些,總以爲 Apache 有些彆扭。固然了,asp.net core 應用是能夠獨立運行,因此,你確實能夠直接公開指向應用程序的 url,而不使用反向代理。不過,官方推薦使用服務器組件來反向代理。nginx

所謂反向代理,說白了就是這樣的:客戶端發送 HTTP 請求,首先由 nginx 服務收到請求,而後把 HTTP 請求轉發給 ASP.NET Core 應用程序,請求處理完後,迴應消息也是沿原路返回,從.net 程序發回 nginx,再由 nginx 服務發回客戶端。json

好,少說 P 話,我們開始吧。瀏覽器

 

安裝 nginx 服務

在上一篇中,老周說過把軟件包更新源(sources.list)更改成國內的源,由於國外的源有時候很慢,並且常常會掛掉。上次老周演示的是使用網易的開源鏡像,速度挺快的。如今,我們執行一下這條命令,這是個好習慣,每次安裝軟件前,update 一下軟件源。服務器

sudo apt update

這條命令僅僅更新軟件源,就是你在 sources.list 或 sources.list.d 中配置的源,並非真正更新軟件,要執行軟件包更新,能夠執行:app

sudo apt upgrade

如今,我們安裝一下 nginx。asp.net

sudo apt install nginx

 

 想運行 nginx ,輸入如下命令。工具

sudo nginx

而後,在瀏覽器中訪問 http://localhost,若是看到如下內容,說明你的 nginx 沒問題了。佈局

請你要嚴重注意,nginx 默認用的是 80 端口,請保證當前沒有其餘佔用 80 端口服務運行,包括 IIS 也不行,若是是 Linux 子系統,它是共用 Windows 的資源的。post

 

配置反向代理

咱們要配置的文件在  /etc/nginx/sites-enabled 目錄下,有一個 default 文件,咱們只要修改它就能夠了。

爲了不權限問題,能夠先切換到 root 上下文。

su

而後輸入你設置的 root 密碼就好了。

定位到 /etc/nginx/sites-enabled 目錄。

cd /etc/nginx/sites-enabled

而後你能夠 ls 一下,你會看到有個叫 default 的文件。

 

若是你不放心,能夠用 cp default def.bak 備份一下,這裏我就不備份了,直接 X 掉它的全部內容。

echo '' > default

上面這條命令老周前面介紹過,這樣作能夠把文件的內容清空,隨後咱們用 nano 工具編輯。

nano default

在裏面輸入如下內容:

server{
       listen 80;
       location /{
                   proxy_pass http://localhost:15000;
                   proxy_set_header Host $host;
                   proxy_http_version 1.1;
                 }
}

 

nginx 能夠按照不一樣的模塊進行配置,此處咱們須要配置反向代理,即 ngx_http_proxy_module 模塊,該模塊的字段你不用去記,在 nginx 官方網站能夠查到完整文檔的。

老周先給你說 nginx 配置的文件模型吧。其實它的格式很像一個 C 風格的類:

<塊名稱>
{
      字段名1 字段值1;
      字段名2 字段值2;
      字段名3 字段值3;
      ……
      字段名f
               {
                     字段名1 字段值1;
                     字段名2 字段值2;
                     ……
               }
}

首先你要放一個 server 節點。

server{
         .......
}

listen 字段表示監聽的端口,這個就是 80 了,通常不用改。

接着咱們須要一個對路徑的配置,即 location,反向代理就是用於轉發,因此這個路徑我們就用 / ,表示根目錄。

location /{
            ......
}

而後就是爲 location 節點配置幾個字段,所有都是以 proxy 開頭的。

proxy_pass:這個就是填上我們 asp.net Core 應用監聽的端口,默認是 5000,主機名你直接寫 localhost 就能夠了,由於由 nginx 反向代理了,dotnet 應用是不對外公開的,因此你不用填網站的域名,客戶端發送的請求是先到 nginx 再轉發給 dotnet 應用。所以,你只須要讓 nginx 服務器對外公開就好了。

proxy_set_header:這個字段是配置當 nginx 收到客戶端請求後,把消息轉發到 asp.net core 應用時添加的 HTTP 頭,這個你能夠按實際狀況設置,若是你以爲沒什麼標頭有用的,能夠不配置。此處我轉傳了 Host 頭,值是變量 $host ,這是一個局部變量,運行時會由 nginx 服務填充具體的主機名。

proxy_http_version:這個是版本號,你也能夠忽略的。

 

說到底,整個配置最關鍵的是 proxy_pass 字段,只有給它分配了值,nginx 服務纔會知道你的 ASP.NET Core 應用在哪監聽,才能順利轉發。

輸入完後,按 ctrl + o 保存,而後按 ctrl + x 退出。

 

接着執行一下 -t 參數驗證一下上面的配置是否正確。

nginx -t

若是看到「test is successful」說明配置無誤。

隨後還要讓 nginx 從新加載一下配置,這樣纔會使之生效。

nginx -s reload

 

測試效果

下面我們新建一個 ASP.NET Core 應用項目來測試一下,類型選擇「空」就好了,老周喜歡空模板,靈活。

修改 Main 方法,讓監聽端口指向剛剛上面 nginx 配置中指定的 15000 端口號。

        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseUrls("http://localhost:15000")
                .Build();

使用 UseUrls 方法能夠指定監聽的 URL,固然,你也能夠用配置文件(.json)來設置,或者能夠指定通配域名 http://*:15000。

而後修改 Startup 類。在 ConfigureServices 方法中,添加 MVC 服務功能。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();         }

在 Configure 方法中啓用 MVC 功能。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();         }

注意這兩個地方是不一樣的,前面 AddMvc 只是添加這個功能,並無啓用,因此你隨後要經過 Use 方法啓用功能,並把與 MVC 相關的中間件插入 HTTP 通訊管道中,以處理 HTTP 請求。

 

我們這個項目只用來測試人品的,因此老周就不遵照 MVC 的規範了,不建 Views 、Controllers等目錄了,反正老周向來都是不按常規出牌的。直接在項目中新建一個類,名字你隨便取,按照約定,應該叫 XXXController,固然你也能夠不這樣叫,叫 Cat,叫 Pig 都行,只要類是從 Controller 類繼承,運行時也能認的。

    public class DemoController : Controller
    {
        [HttpGet("/")]
        public IActionResult Start()
        {
            return View("~/Main.cshtml");
        }

        [HttpPost("/setdata")]
        public IActionResult Setdata([FromForm]int a, [FromForm]int b)
        {
            int r = a + b;
            return View("~/Show.cshtml", r);
        }
    }

注意,類必須是公共的,類的成員也要公共的,否則後面無法用。第一個 action 方法叫 Start,我加了 HttpGet 特性,以 GET 方式訪問,並指定了「/」模板,代表你從應用的根 URL 就能執行這個 Start 方法,即輸入 http://localhost:15000/,就能訪問到。第二個 action 方法名叫 Setdata,HttpPost 表示以 POST 方式訪問,路徑是 http://localhost:15000/setdata。

Setdata 方法有兩個參數,a和b。我給它們加了 FromForm 特性,啥意思呢,就是說客戶端頁面的 <form> 元素 POST 上來的內容中,必定要包含叫 a 和 b 的兩個字段,這樣參數 a 和 b 就會自動獲取到值了。好比,客戶端 POST 上來的是 a=5&b=9,那麼 Setdata 方法的參數就能夠得到值 a = 5,b = 9。

 

因爲這個示例沒有創建 Views 文件夾,按照默認的搜規則是找不到視圖的,因此這裏必定要指定視圖的完整文件名。在新建視圖頁前,先建個佈局頁,能夠做爲母板。文件名爲 _Layout.cshtml,內容以下:

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" charset="utf-8" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <div>
        @RenderBody()
    </div>
</body>
</html>

RenderBody方法指定,其餘視圖頁一旦套用這個母板頁,就會用它的內容替換 RenderBody。

 

如今我們新建一個視圖頁—— Main.cshtml。

@{ 
    Layout = "~/_Layout.cshtml";
}

<div>
    <div>
        <h3>請輸入參數</h3>
    </div>
    <div>
        <form method="post" action="/setdata">
            <div>
                <label for="a">第一個數:</label>
                <input type="text" name="a"/>
            </div>
            <div>
                <label for="b">
                    第二個數:
                </label>
                <input type="text" name="b"/>
            </div>
            <div>
                <button type="submit">肯定</button>
            </div>
        </form>
    </div>
</div>

Layout 屬性引用母板頁。form 元素的 action 值指向 Setdata 方法,剛剛我們用 HttpPost 特性定義了它的路徑是 /setdata。

 

下面是第二個視圖頁—— Show.cshtml。

@{ Layout = "~/_Layout.cshtml"; }

@model int <div >
    <div >計算結果:</div>
    <div>@Model</div>
</div>

使用 @model 指令指定做爲當前視圖的 Model 屬性的類型,這裏用的是 int ,爲啥呢,還記得 Setdata 方法嗎?

        public IActionResult Setdata([FromForm]int a, [FromForm]int b)
        {
            int r = a + b;
            return View("~/Show.cshtml", r);         }

最後一句,在返回視圖頁的同時,把變量 r 的值也傳遞進去,它是 int 類型,所以,在 Show.cshtml 頁面中應當以 int 類型界定 Model 屬性。

在頁面上,訪問 Model 屬性就能夠獲得傳過來的計算結果了。

 <div>@Model</div>

 

好了,這個示例就完工了,先把這個示例運行起來,接着確保 nginx 已在 Linux 子系統中運行,若是不肯定,能夠輸入

service nginx status

若是看到這個,表示 nginx 正在運行。

若是 not running 的話,最簡單一招,直接輸入 nginx 回車,就會運行了。

 

在瀏覽器中輸入 http://localhost,回車,默認端口是 80,不用輸端口號。

若是出現這個,請檢查 asp.net core 應用運行了沒有。

 

 

 咱們隨便輸入兩個整數。

而後提交,就會看到兩個整數相加的結果了。

 

 如此,代表 nginx 已經成功將 HTTP 消息轉發了,反向代理就順利完成了。

好了,吃飯時間到了,今天煮的是牛肉,好久沒吃牛肉了,趕忙開飯。

本文示例源碼下載地址,請點擊這裏

相關文章
相關標籤/搜索