分享 ASP.NET Core 菜烏問題一枚。

使用 Visual Studio 或 dotnet 命令列工具編譯發佈 ASP.NET Core 專案後,執行 dotnet WebAsmName.dll 可啟動 Kestrel 執行網站,預設是聽 httq://localhost:5000 及 httqs://localhost:5001。延伸閱讀:ASP.NET Core 練功筆記 1ASP.NET Core 練功筆記 2 – Ubuntu + SQLite + Dapper

有趣的是,當我以 microsoft/dotnet:2.1-aspnetcore-runtime Image 將同樣的 ASP.NET Core 網站包成 Docker 容器,設定檔沒動也沒設參數,網站卻會改掛在 80 Port。延伸閱讀:ASP.NET Core Docker 筆記 1 - 初探

就這麼知其然不知其所然混了好幾個月,是該花點時間把它搞清楚。

答案很簡單,依據官方文件,Kestrel 聽什麼 Port 可透過以下幾種方式控制:

  • 不設定(No Configuration)
    預設聽 httq://localhost:5000 及 httqs://localhost:5001 (前題是需先設好 SSL 憑證)
  • 使用 ASPNETCORE_URLS 環境參數
    在 Docker 裡自動改聽 80 Port 的謎底解開了 - 在 Docker 容器中 ASPNETCORE_URLS 環境變數被設成 http://+:80
  • dotnet Web.dll 時加上 --urls 參數
    例如以下範例:
  • 透過 appSettings.json 指定
    加入 Kestrel / EndPoints / Http / Url 指定,範例如下:
    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "Kestrel": {
      	"EndPoints": {
      		"Http": {
      			"Url": "http://localhost:5123"
     		}
    	}
      }
    }
    
  • 呼叫 UseUrls() 擴充方法
    UseUrls() 可傳入一或多個端點 URL 指定 Kestrel 網站要聽的 Port,但將設定寫死在程式碼不是好主意,略過。
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
          .UseStartup<Startup>()
          .UseUrls("http://localhost:5123");
    

實務上讓 Kestrel 直接對外提供服務的機會不多,中間多會搭配 IIS、Nginx 等 Reverse Proxy。即使是無 Docker 環境,我們也只需有能力指定錯開 TCP Port 避免打架就夠了。至於要掛載多個 Port、依 Host Header 導向不同網站、設定 SSL 憑證,交給 Nginx、Certbot 才是王道。官方文件還有很多關於 Kestrel 進階設定的介紹,等到要用時再查。

Summary the ways to configure Kestrel tcp port.


Comments

# by Jacky Wu

為什麼要把http打成httq

# by Jeffrey

to Jacky Wu, 文章內含的 http:// ... 有時會被部落格平台識別成可點擊連結,自動轉成 <a href=''>,故非供閱讀的 URL 會改寫成 httq。

Post a comment