Các triển khai Web Server (máy chủ web) trong ASP.NET Core
Nguồn: Web server implementations in ASP.NET Core | Phiên bản: .NET 8.0
Bởi Tom Dykstra, Steve Smith, Stephen Halter, và Chris Ross
Một ứng dụng ASP.NET Core chạy với một triển khai HTTP server (máy chủ HTTP) in-process (trong tiến trình). Server implementation (triển khai máy chủ) lắng nghe các HTTP request (yêu cầu HTTP) và đưa chúng vào ứng dụng dưới dạng tập hợp các request features (tính năng yêu cầu) được tổng hợp thành một HttpContext.
Trong bài viết này
Lưu ý: Đây không phải là phiên bản mới nhất của bài viết này. Để xem phiên bản hiện tại, hãy xem phiên bản .NET 10 của bài viết này.
Cảnh báo: Phiên bản ASP.NET Core này không còn được hỗ trợ. Để biết thêm thông tin, hãy xem Chính sách hỗ trợ .NET và .NET Core. Để xem phiên bản hiện tại, hãy xem phiên bản .NET 10 của bài viết này.
Windows
ASP.NET Core đi kèm với các thành phần sau:
- Kestrel server (máy chủ Kestrel) là triển khai HTTP server mặc định, đa nền tảng. Kestrel cung cấp hiệu suất và mức sử dụng bộ nhớ tốt nhất, nhưng không có một số tính năng nâng cao của HTTP.sys. Để biết thêm thông tin, hãy xem Kestrel vs. HTTP.sys trong tab Windows.
- IIS HTTP Server là một in-process server (máy chủ trong tiến trình) cho IIS (Internet Information Services).
- HTTP.sys server (máy chủ HTTP.sys) là một HTTP server chỉ dành cho Windows, dựa trên HTTP.sys kernel driver (trình điều khiển nhân) và HTTP Server API.
Khi sử dụng IIS (Internet Information Services) hoặc IIS Express, ứng dụng chạy theo một trong hai cách:
- Trong cùng tiến trình với IIS worker process (tiến trình công nhân IIS) — in-process hosting model (mô hình hosting trong tiến trình) với IIS HTTP Server. Cấu hình in-process là cấu hình được khuyến nghị.
- Trong một tiến trình riêng biệt với IIS worker process — out-of-process hosting model (mô hình hosting ngoài tiến trình) với Kestrel server (máy chủ Kestrel).
ASP.NET Core Module (mô-đun ASP.NET Core) là một IIS module (mô-đun IIS) gốc xử lý các native IIS request (yêu cầu IIS gốc) giữa IIS và in-process IIS HTTP Server hoặc Kestrel. Để biết thêm thông tin, hãy xem ASP.NET Core Module (ANCM) for IIS.
Kestrel vs. HTTP.sys
Kestrel có các ưu điểm sau so với HTTP.sys:
- Hiệu suất và mức sử dụng bộ nhớ tốt hơn.
- Đa nền tảng (cross-platform).
- Tính linh hoạt cao — được phát triển và vá lỗi độc lập với hệ điều hành.
- Cấu hình port (cổng) và TLS theo chương trình (programmatic).
- Khả năng mở rộng cho phép tích hợp các giao thức như PPv2 và các transport (phương thức truyền tải) thay thế.
HTTP.sys hoạt động như một shared kernel mode component (thành phần chế độ nhân dùng chung) với các tính năng mà Kestrel không có:
- Port sharing (chia sẻ cổng).
- Kernel mode Windows authentication (xác thực Windows chế độ nhân). Kestrel chỉ hỗ trợ user-mode authentication (xác thực chế độ người dùng).
- Fast proxying (proxy nhanh) thông qua queue transfers (chuyển tiếp hàng đợi).
- Direct file transmission (truyền tệp trực tiếp).
- Response caching (bộ nhớ đệm phản hồi).
Các mô hình Hosting
Có một số hosting model (mô hình hosting) khả dụng:
- Kestrel self-hosting (tự host bằng Kestrel): Kestrel web server chạy mà không cần bất kỳ web server bên ngoài nào khác như IIS hay HTTP.sys.
- HTTP.sys self-hosting (tự host bằng HTTP.sys) là một giải pháp thay thế cho Kestrel. Kestrel được khuyến nghị hơn HTTP.sys trừ khi ứng dụng yêu cầu các tính năng không có trong Kestrel.
- IIS in-process hosting (hosting trong tiến trình IIS): Một ứng dụng ASP.NET Core chạy trong cùng tiến trình với IIS worker process của nó. IIS in-process hosting cung cấp hiệu suất tốt hơn so với IIS out-of-process hosting vì các request (yêu cầu) không được proxy qua loopback adapter (bộ điều hợp vòng lặp), một giao diện mạng trả lại lưu lượng mạng đi ra về cùng một máy. IIS xử lý quản lý tiến trình với Windows Process Activation Service (WAS).
- IIS out-of-process hosting (hosting ngoài tiến trình IIS): Các ứng dụng ASP.NET Core chạy trong một tiến trình riêng biệt với IIS worker process, và module (mô-đun) xử lý việc quản lý tiến trình. Module khởi động tiến trình cho ứng dụng ASP.NET Core khi request (yêu cầu) đầu tiên đến và khởi động lại ứng dụng nếu nó tắt hoặc gặp sự cố. Về cơ bản, đây là hành vi tương tự như các ứng dụng chạy in-process được quản lý bởi Windows Process Activation Service (WAS). Việc sử dụng một tiến trình riêng biệt cũng cho phép hosting nhiều hơn một ứng dụng từ cùng một app pool (nhóm ứng dụng).
Để biết thêm thông tin, hãy xem các tài nguyên sau:
Kestrel
Kestrel server (máy chủ Kestrel) là triển khai HTTP server mặc định, đa nền tảng. Kestrel cung cấp hiệu suất và mức sử dụng bộ nhớ tốt nhất, nhưng không có một số tính năng nâng cao của HTTP.sys. Để biết thêm thông tin, hãy xem Kestrel vs. HTTP.sys trong tài liệu này.
Sử dụng Kestrel:
- Độc lập như một edge server (máy chủ biên) xử lý các request (yêu cầu) trực tiếp từ mạng, bao gồm cả Internet.
!Kestrel giao tiếp trực tiếp với Internet mà không cần reverse proxy server
- **Kết hợp với một reverse proxy server (máy chủ proxy ngược)**, chẳng hạn như Internet Information Services (IIS), Nginx, hoặc Apache. Reverse proxy server nhận HTTP request (yêu cầu HTTP) từ Internet và chuyển tiếp chúng đến Kestrel.
Cả hai cấu hình hosting — có hoặc không có reverse proxy server — đều được hỗ trợ.
Để biết hướng dẫn cấu hình Kestrel và thông tin về thời điểm sử dụng Kestrel trong cấu hình reverse proxy, hãy xem Kestrel web server in ASP.NET Core.
IIS với Kestrel (mô hình out-of-process)
Khi sử dụng IIS (Internet Information Services) hoặc IIS Express, ứng dụng chạy trong một tiến trình riêng biệt với IIS worker process (out-of-process) với Kestrel server (máy chủ Kestrel).
Vì các ứng dụng ASP.NET Core chạy trong một tiến trình riêng biệt với IIS worker process, module (mô-đun) xử lý việc quản lý tiến trình. Module khởi động tiến trình cho ứng dụng ASP.NET Core khi request (yêu cầu) đầu tiên đến và khởi động lại ứng dụng nếu nó tắt hoặc gặp sự cố. Về cơ bản, đây là hành vi tương tự như các ứng dụng chạy in-process được quản lý bởi Windows Process Activation Service (WAS).
Sơ đồ sau minh họa mối quan hệ giữa IIS, ASP.NET Core Module (mô-đun ASP.NET Core), và một ứng dụng được host theo mô hình out-of-process:
Các request (yêu cầu) đến từ web thông qua kernel-mode HTTP.sys driver (trình điều khiển nhân HTTP.sys). Driver định tuyến các request đến IIS trên port (cổng) được cấu hình của website, thường là 80 (HTTP) hoặc 443 (HTTPS). Module chuyển tiếp các request đến Kestrel trên một port ngẫu nhiên cho ứng dụng, không phải là port 80 hay 443.
Module chỉ định port thông qua một biến môi trường (environment variable) khi khởi động, và IIS Integration Middleware cấu hình server để lắng nghe trên http://localhost:{port}. Các kiểm tra bổ sung được thực hiện, và các request không xuất phát từ module sẽ bị từ chối. Module không hỗ trợ HTTPS forwarding (chuyển tiếp HTTPS), vì vậy các request được chuyển tiếp qua HTTP ngay cả khi được IIS nhận qua HTTPS.
Sau khi Kestrel nhận request (yêu cầu) từ module, request được đẩy vào ASP.NET Core middleware pipeline (đường ống middleware). Middleware pipeline xử lý request và chuyển nó như một instance HttpContext đến logic của ứng dụng. Middleware được thêm bởi IIS Integration cập nhật scheme (lược đồ), remote IP (địa chỉ IP từ xa), và pathbase để tính đến việc chuyển tiếp request đến Kestrel. Response (phản hồi) của ứng dụng được chuyển trả lại cho IIS, rồi IIS đẩy nó ra ngoài đến HTTP client (máy khách HTTP) đã khởi tạo request.
Để biết hướng dẫn cấu hình IIS và ASP.NET Core Module (mô-đun ASP.NET Core), hãy xem các chủ đề sau:
Nginx với Kestrel
Để biết thông tin về cách sử dụng Nginx trên Linux làm reverse proxy server (máy chủ proxy ngược) cho Kestrel, hãy xem Host ASP.NET Core on Linux with Nginx.
HTTP.sys
Nếu các ứng dụng ASP.NET Core chạy trên Windows, HTTP.sys là một giải pháp thay thế cho Kestrel. Kestrel được khuyến nghị hơn HTTP.sys trừ khi ứng dụng yêu cầu các tính năng không có trong Kestrel. Để biết thêm thông tin, hãy xem HTTP.sys web server implementation in ASP.NET Core.
!HTTP.sys giao tiếp trực tiếp với Internet
HTTP.sys cũng có thể được sử dụng cho các ứng dụng chỉ được hiển thị trong mạng nội bộ.
!HTTP.sys giao tiếp trực tiếp với mạng nội bộ
Để biết hướng dẫn cấu hình HTTP.sys, hãy xem HTTP.sys web server implementation in ASP.NET Core.
Cơ sở hạ tầng ASP.NET Core server
IApplicationBuilder có sẵn trong phương thức Startup.Configure hiển thị thuộc tính ServerFeatures thuộc kiểu IFeatureCollection. Kestrel và HTTP.sys mỗi cái chỉ hiển thị một tính năng duy nhất là IServerAddressesFeature, nhưng các triển khai server khác nhau có thể hiển thị thêm chức năng.
IServerAddressesFeature có thể được sử dụng để tìm hiểu xem triển khai server đã bind (liên kết) tại port nào trong runtime (thời gian chạy).
Custom servers (máy chủ tùy chỉnh)
Nếu các server tích hợp sẵn không đáp ứng yêu cầu của ứng dụng, có thể tạo một triển khai server tùy chỉnh. Open Web Interface for .NET (OWIN) guide trình bày cách viết một triển khai IServer dựa trên Nowin. Chỉ các feature interface (giao diện tính năng) mà ứng dụng sử dụng mới cần được triển khai, mặc dù tối thiểu phải hỗ trợ IHttpRequestFeature và IHttpResponseFeature.
Khởi động Server
Server được khởi chạy khi Integrated Development Environment (IDE — môi trường phát triển tích hợp) hoặc editor (trình chỉnh sửa) khởi động ứng dụng:
- Visual Studio: Launch profile (hồ sơ khởi chạy) có thể được sử dụng để khởi động ứng dụng và server với IIS Express/ASP.NET Core Module hoặc console.
- Visual Studio Code: Ứng dụng và server được khởi động bởi Omnisharp, thứ kích hoạt CoreCLR debugger (trình gỡ lỗi CoreCLR).
Khi khởi chạy ứng dụng từ command prompt (dấu nhắc lệnh) trong thư mục dự án, dotnet run khởi chạy ứng dụng và server (chỉ Kestrel và HTTP.sys). Cấu hình được chỉ định bởi tùy chọn -c|--configuration, được đặt thành Debug (mặc định) hoặc Release.
Tệp launchSettings.json cung cấp cấu hình khi khởi chạy ứng dụng bằng dotnet run hoặc bằng debugger được tích hợp trong các công cụ như Visual Studio. Nếu có launch profile trong tệp launchSettings.json, hãy sử dụng tùy chọn --launch-profile {PROFILE NAME} với lệnh dotnet run hoặc chọn profile trong Visual Studio. Để biết thêm thông tin, hãy xem dotnet run và .NET distribution packaging.
Hỗ trợ HTTP/2
HTTP/2 được hỗ trợ với ASP.NET Core trong các kịch bản triển khai sau:
Windows
- Kestrel
- Hệ điều hành:
- Windows Server 2016/Windows 10 trở lên†
- Linux với OpenSSL 1.0.2 trở lên (ví dụ: Ubuntu 16.04 trở lên)
- macOS 10.15 trở lên
- Target framework (framework mục tiêu): .NET Core 2.2 trở lên
- HTTP.sys
- Windows Server 2016/Windows 10 trở lên
- Target framework: Không áp dụng cho các triển khai HTTP.sys.
- IIS (in-process)
- Windows Server 2016/Windows 10 trở lên; IIS 10 trở lên
- Target framework: .NET Core 2.2 trở lên
- IIS (out-of-process)
- Windows Server 2016/Windows 10 trở lên; IIS 10 trở lên
- Các kết nối edge server (máy chủ biên) hướng ra công cộng sử dụng HTTP/2, nhưng kết nối reverse proxy (proxy ngược) đến Kestrel sử dụng HTTP/1.1.
- Target framework: Không áp dụng cho các triển khai IIS out-of-process.
macOS
- Kestrel
- Hệ điều hành:
- Windows Server 2016/Windows 10 trở lên†
- Linux với OpenSSL 1.0.2 trở lên (ví dụ: Ubuntu 16.04 trở lên)
- HTTP/2 sẽ được hỗ trợ trên macOS trong một bản phát hành tương lai.
- Target framework: .NET Core 2.2 trở lên
- HTTP.sys
- Windows Server 2016/Windows 10 trở lên
- Target framework: Không áp dụng cho các triển khai HTTP.sys.
- IIS (in-process)
- Windows Server 2016/Windows 10 trở lên; IIS 10 trở lên
- Target framework: .NET Core 2.2 trở lên
- IIS (out-of-process)
- Windows Server 2016/Windows 10 trở lên; IIS 10 trở lên
- Các kết nối edge server hướng ra công cộng sử dụng HTTP/2, nhưng kết nối reverse proxy đến Kestrel sử dụng HTTP/1.1.
- Target framework: Không áp dụng cho các triển khai IIS out-of-process.
Linux
- Kestrel
- Hệ điều hành:
- Windows Server 2016/Windows 10 trở lên†
- Linux với OpenSSL 1.0.2 trở lên (ví dụ: Ubuntu 16.04 trở lên)
- HTTP/2 sẽ được hỗ trợ trên macOS trong một bản phát hành tương lai.
- Target framework: .NET Core 2.2 trở lên
- HTTP.sys
- Windows Server 2016/Windows 10 trở lên
- Target framework: Không áp dụng cho các triển khai HTTP.sys.
- IIS (in-process)
- Windows Server 2016/Windows 10 trở lên; IIS 10 trở lên
- Target framework: .NET Core 2.2 trở lên
- IIS (out-of-process)
- Windows Server 2016/Windows 10 trở lên; IIS 10 trở lên
- Các kết nối edge server hướng ra công cộng sử dụng HTTP/2, nhưng kết nối reverse proxy đến Kestrel sử dụng HTTP/1.1.
- Target framework: Không áp dụng cho các triển khai IIS out-of-process.
†Kestrel có hỗ trợ giới hạn cho HTTP/2 trên Windows Server 2012 R2 và Windows 8.1. Hỗ trợ bị giới hạn vì danh sách các TLS cipher suite (bộ mật mã TLS) được hỗ trợ trên các hệ điều hành này bị giới hạn. Có thể cần một certificate (chứng chỉ) được tạo bằng Elliptic Curve Digital Signature Algorithm (ECDSA — thuật toán chữ ký số đường cong elliptic) để bảo mật các kết nối TLS.
Một kết nối HTTP/2 phải sử dụng Application-Layer Protocol Negotiation (ALPN — đàm phán giao thức tầng ứng dụng) và TLS 1.2 trở lên. Để biết thêm thông tin, hãy xem các chủ đề liên quan đến kịch bản triển khai server của bạn.
Các mẫu ứng dụng web doanh nghiệp
Để được hướng dẫn về cách tạo một ứng dụng ASP.NET Core đáng tin cậy, bảo mật, hiệu quả, có thể kiểm tra và có khả năng mở rộng, hãy xem Enterprise web app patterns (các mẫu ứng dụng web doanh nghiệp). Một ứng dụng web mẫu hoàn chỉnh đạt chất lượng sản xuất, triển khai các mẫu này, có sẵn để tham khảo.