分享 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

Be the first to post a comment

Post a comment


70 + 19 =