ASP.NET Core 2.2 基礎知識(十) Web伺服器 - Kestrel
ASP.NET Core 應用與程序內的 HTTP 伺服器實現一起執行.該伺服器實現偵聽 HTTP 請求,並在一系列請求功能被寫到 HttpContext 時,將這些請求展現到應用中.
ASP.NET Core 隨附兩種伺服器實現:
- Kestrel 是適用於 ASP.NET Core 的預設跨平臺 HTTP 伺服器.
- HTTP.sys 是僅適用於 Windows 的 HTTP 伺服器,它基於 HTTP.sys 核心驅動程式和 HTTP 伺服器 API.在 ASP.NET 1.x 中被命名為 WebListener.
Kestrel
Kestrel 可以單獨使用,也可以與反向代理伺服器(如IIS,Nginx 或 Apache)一起使用.反向代理伺服器接收到來自 Internet 的 HTTP 請求,並在執行一些初步處理後,將這些請求轉發到 Kestrel.
將 IIS 或 IIS Express 用作 ASP.NET Core 的反向代理時,ASP.NET Core 應用在獨立於 IIS 工作程序的某個程序中執行.在 IIS 程序中,ASP.NET Core 模組協調反向代理關係.ASP.NET Core 模組的主要功能是啟動ASP.NET Core 應用,在其出現故障時重啟應用,並嚮應用轉發 HTTP 流量.
HTTP.sys
如果 ASP.NET Core 應用在 Windows 上執行,則 HTTP.sys 是 Kestrel 的替代選項.為了獲得最佳效能,通常建議使用 Kestrel,在向 Internet 公開應用且所需功能受 HTTP.sys 支援(而不是 Kestrel)的方案中,可以使用HTTP.sys.
何時結合使用 Kestrel 和反向代理
即使不需要反向代理伺服器,使用反向代理伺服器也是個不錯的選擇:
- 它可以限制所承載的應用中的公開的公共外圍應用;
- 它可以提供額外的配置和防護層;
- 它可以更好地與現有基礎結構整合;
- 他可以簡化負載均衡和SSL配置,僅反向代理伺服器需要SSL證書,並且該伺服器可以使用普通 HTTP 在內部網路上與應用伺服器通訊.
啟用 Kestrel
預設情況下,ASP.NET Core 專案的 Program.cs 檔案中 的 CreateDefaultBuilder 方法內部呼叫了 UseKestrel .
Kestrel 選項
Kestrel Web 伺服器有很多選項,這些選項在面相 Internet 的部署中非常重要:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseKestrel((context, options) => { //設定最大連線數,預設不受限制 { options.Limits.MaxConcurrentConnections = 100; //對於已從 HTTP 或 HTTPS 升級到另一個協議(例如,Websocket 請求)的連線,使用下面這個屬性設定最大連線數. options.Limits.MaxConcurrentUpgradedConnections = 100; } //請求正文限制,預設最大 30,000,000 位元組,約 28.6 MB. { options.Limits.MaxRequestBodySize = 10 * 1024; } /*請求正文最小資料速率和寬限期 Kestrel 每秒檢查一次資料是否以指定的速率(位元組/秒)傳入.如果速率低於最小值,則連線超時。 寬限期是 Kestrel 提供給客戶端用於將其傳送速率提升到最小值的時間量.在此期間不會檢查速率.寬限期有助於避免最初由於 TCP 慢啟動而以較慢速率傳送資料的連線中斷。 預設的最小速率為 240 位元組/秒,包含 5 秒的寬限期。 最小速率也適用於響應。 * */ { options.Limits.MinRequestBodyDataRate = new MinDataRate(100, TimeSpan.FromSeconds(10)); options.Limits.MinResponseDataRate = new MinDataRate(100, TimeSpan.FromSeconds(10)); } }); }
終結點配置
預設情況下,ASP.NET Core 應用繫結到 http//localhost:5000 ,如果建立專案時勾選了 "為 HTTPS 配置" ,則還會繫結到 https://localhosst:5001
這點,我們從 launchSetting.json 檔案中也可以查到:
"Demo1": { "commandName": "Project", "launchBrowser": true, "launchUrl": "api/values", "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }
我們可以通過修改 launchSetting.json 檔案來修改終結點.
"Demo2": { "commandName": "Project", "launchBrowser": true, "launchUrl": "api/values", "applicationUrl": "http://localhost:5566;http://localhost:6677;https://localhost:7788", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }
也可以通過 UseUrls 方法修改終結點:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://localhost:9527","https://localhost:8848");
修改埠號
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() //下面三種修改方式都是可以的. .ConfigureKestrel(options => { options.ListenLocalhost(9902); }); //.UseKestrel(options => { options.ListenLocalhost(9901); }); //.UseKestrel((context, options) => { options.ListenLocalhost(9900); }) }
如果我們設定埠號 為 0 ,那麼 Kestrel 將動態繫結到可用的埠號.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() //正確方法 .UseKestrel(options => { options.ListenAnyIP(0); }); //.UseUrls("http://127.0.0.1:0"); //.UseKestrel((context, options) => { options.ListenAnyIP(0); }); //.ConfigureKestrel(options => { options.ListenAnyIP(0); }); //錯誤寫法: ListenLocalhost(0) 及 UseUrls("http://localhost:0"); }