Nguon: Microsoft Learn · .NET 8.0

Cấu hình nâng cao IIS với ASP.NET Core

Nguồn: Advanced configuration

Bài viết này đề cập đến các tùy chọn và tình huống cấu hình nâng cao cho ASP.NET Core Module và IIS.

Sửa đổi kích thước stack

Chỉ áp dụng khi sử dụng mô hình hosting in-process.

Cấu hình kích thước managed stack (ngăn xếp được quản lý) bằng cài đặt stackSize tính bằng hexadecimal bytes (byte hex) trong file web.config. Kích thước mặc định là 0x100000 bytes (1 MB). Ví dụ sau thay đổi kích thước stack thành 2 MB (2.097.152 bytes) theo hex 0x200000:

xml
<aspNetCore processPath="dotnet"
    arguments=".\MyApp.dll"
    stdoutLogEnabled="false"
    stdoutLogFile="\\?\%home%\LogFiles\stdout"
    hostingModel="inprocess">
  <handlerSettings>
    <handlerSetting name="stackSize" value="200000" />
  </handlerSettings>
</aspNetCore>

Không cho phép xoay vòng khi cấu hình thay đổi (Disallow rotation on config)

Cài đặt disallowRotationOnConfigChange dành cho các tình huống blue/green (xanh lam/xanh lá) trong đó thay đổi cấu hình chung không nên khiến tất cả các site tái chế (recycle). Khi flag này là true, chỉ những thay đổi liên quan đến chính site mới khiến nó tái chế. Ví dụ: một site sẽ tái chế nếu web.config của nó thay đổi, nhưng thay đổi chung với applicationHost.config sẽ không khiến ứng dụng tái chế. Ví dụ sau đặt cài đặt này thành true:

xml
<aspNetCore processPath="dotnet"
    arguments=".\MyApp.dll"
    stdoutLogEnabled="false"
    stdoutLogFile="\\?\%home%\LogFiles\stdout"
    hostingModel="inprocess">
  <handlerSettings>
    <handlerSetting name="disallowRotationOnConfigChange" value="true" />
  </handlerSettings>
</aspNetCore>

Giảm khả năng xảy ra 503 trong quá trình tái chế ứng dụng

Theo mặc định, có độ trễ một giây giữa khi IIS được thông báo về việc tái chế hoặc tắt và khi ANCM yêu cầu managed server bắt đầu tắt. Độ trễ này có thể được cấu hình qua biến môi trường ANCM_shutdownDelay hoặc bằng cách đặt handler setting shutdownDelay. Cả hai giá trị đều tính bằng millisecond. Độ trễ chủ yếu để giảm khả năng xảy ra race condition (tình huống đua tranh) trong đó:

Ví dụ sau đặt độ trễ thành 5 giây:

xml
<aspNetCore processPath="dotnet"
    arguments=".\MyApp.dll"
    stdoutLogEnabled="false"
    stdoutLogFile="\\?\%home%\LogFiles\stdout"
    hostingModel="inprocess">
  <handlerSettings>
    <handlerSetting name="shutdownDelay" value="5000" />
  </handlerSettings>
</aspNetCore>

Cấu hình proxy sử dụng giao thức HTTP và pairing token

Chỉ áp dụng cho out-of-process hosting.

Proxy (máy chủ ủy quyền) được tạo giữa ASP.NET Core Module và Kestrel sử dụng giao thức HTTP. Không có rủi ro nghe trộm lưu lượng giữa module và Kestrel từ vị trí bên ngoài server.

Một pairing token (token ghép đôi) được sử dụng để đảm bảo rằng các request nhận được bởi Kestrel được proxy bởi IIS và không đến từ nguồn khác. Pairing token được tạo và đặt vào biến môi trường (ASPNETCORE_TOKEN) bởi module. Pairing token cũng được đặt vào header (MS-ASPNETCORE-TOKEN) trên mọi request được proxy. IIS Middleware kiểm tra từng request nhận được để xác nhận giá trị header pairing token khớp với giá trị biến môi trường.

ASP.NET Core Module với IIS Shared Configuration

ASP.NET Core Module installer chạy với đặc quyền của tài khoản TrustedInstaller. Vì tài khoản hệ thống cục bộ không có quyền sửa đổi đường dẫn chia sẻ được sử dụng bởi IIS Shared Configuration, installer sẽ báo lỗi access denied khi cố gắng cấu hình cài đặt module trong file applicationHost.config trên chia sẻ.

Khi sử dụng IIS Shared Configuration trên cùng máy với cài đặt IIS, hãy chạy ASP.NET Core Hosting Bundle installer với tham số OPT_NO_SHARED_CONFIG_CHECK đặt thành 1:

console
dotnet-hosting-{VERSION}.exe OPT_NO_SHARED_CONFIG_CHECK=1

Khi đường dẫn đến cấu hình chia sẻ không nằm trên cùng máy với cài đặt IIS, hãy làm theo các bước sau:

  1. Tắt IIS Shared Configuration.
  2. Chạy installer.
  3. Xuất file applicationHost.config đã cập nhật sang file share.
  4. Bật lại IIS Shared Configuration.

Bảo vệ dữ liệu (Data protection)

ASP.NET Core Data Protection stack được sử dụng bởi một số ASP.NET Core middleware, bao gồm middleware được sử dụng trong authentication (xác thực). Ngay cả khi Data Protection API không được gọi bởi code người dùng, data protection cũng nên được cấu hình với deployment script hoặc trong code người dùng để tạo key store mật mã bền vững. Nếu data protection không được cấu hình, các key sẽ được giữ trong bộ nhớ và bị loại bỏ khi ứng dụng khởi động lại.

Nếu Data Protection key ring được lưu trong bộ nhớ khi ứng dụng khởi động lại:

Để cấu hình data protection dưới IIS để bảo tồn key ring, hãy sử dụng một trong các phương pháp sau:

ASP.NET Core Data Protection keys được sử dụng bởi các ứng dụng ASP.NET Core được lưu trong registry bên ngoài các ứng dụng. Để bảo tồn các key cho ứng dụng nhất định, hãy tạo Registry keys cho app pool.

Với cài đặt IIS đơn lẻ, không phải webfarm, script PowerShell Data Protection Provision-AutoGenKeys.ps1 có thể được sử dụng cho mỗi app pool được sử dụng với ứng dụng ASP.NET Core.

Cài đặt này ở trong phần Process Model dưới Advanced Settings của app pool. Đặt Load User Profile thành True. Khi đặt thành True, các key được lưu trong thư mục user profile và được bảo vệ bằng DPAPI với key cụ thể cho tài khoản người dùng.

Điều chỉnh code ứng dụng để sử dụng file system làm key ring store. Sử dụng chứng chỉ X509 để bảo vệ key ring và đảm bảo chứng chỉ là chứng chỉ đáng tin cậy.

Hệ thống Data Protection có hỗ trợ hạn chế cho việc đặt chính sách machine-wide mặc định cho tất cả các ứng dụng sử dụng Data Protection API.

Cấu hình IIS

Hệ điều hành Windows Server

Bật role server Web Server (IIS) và thiết lập role services.

  1. Sử dụng wizard Add Roles and Features từ menu Manage hoặc link trong Server Manager. Ở bước Server Roles, check box Web Server (IIS).
  2. Sau bước Features, bước Role services tải cho Web Server (IIS). Chọn các IIS role services mong muốn hoặc chấp nhận các role services mặc định.
  1. Tiến hành qua bước Confirmation để cài đặt web server role và services.

Hệ điều hành Windows Desktop

Bật IIS Management ConsoleWorld Wide Web Services.

  1. Điều hướng đến Control Panel > Programs > Programs and Features > Turn Windows features on or off.
  2. Mở nút Internet Information Services. Mở nút Web Management Tools.
  3. Check box IIS Management Console.
  4. Check box World Wide Web Services.
  5. Chấp nhận các tính năng mặc định cho World Wide Web Services hoặc tùy chỉnh các tính năng IIS.

Virtual Directories (Thư mục ảo)

IIS Virtual Directories không được hỗ trợ với các ứng dụng ASP.NET Core. Ứng dụng có thể được hosted như một sub-application.

Sub-applications (Ứng dụng con)

Ứng dụng ASP.NET Core có thể được hosted như một IIS sub-application (sub-app). Đường dẫn của sub-app trở thành một phần của URL của root app.

Các liên kết static asset trong sub-app nên sử dụng ký hiệu tilde-slash (~/) trong MVC và Razor Pages. Ký hiệu tilde-slash kích hoạt Tag Helper thêm pathbase của sub-app vào đầu relative link được render. Ví dụ: một ảnh được liên kết bằng src="~/image.png" được render thành src="/subapp_path/image.png".

Để hosting ứng dụng ASP.NET Core như sub-app dưới ứng dụng ASP.NET Core khác:

  1. Thiết lập app pool cho sub-app. Đặt .NET CLR Version thành No Managed Code.
  2. Thêm root site trong IIS Manager với sub-app trong một thư mục dưới root site.
  3. Click chuột phải vào thư mục sub-app trong IIS Manager và chọn Convert to Application.
  4. Trong hộp thoại Add Application, sử dụng nút Select cho Application Pool để gán app pool đã tạo cho sub-app.

Application Pools (Nhóm ứng dụng)

Mô hình hosting xác định sự cô lập app pool:

Application Pool Identity

Tài khoản app pool identity cho phép ứng dụng chạy dưới tài khoản duy nhất mà không cần tạo và quản lý domain hoặc local accounts. Trên IIS 8.0 trở lên, IIS Admin Worker Process (WAS) tạo tài khoản ảo với tên của app pool mới và chạy các worker process của app pool dưới tài khoản này theo mặc định.

Sử dụng công cụ ICACLS để cấp quyền. Ví dụ sử dụng DefaultAppPool, lệnh sau cấp quyền đọc và thực thi cho thư mục MyWebApp:

console
ICACLS C:\sites\MyWebApp /grant "IIS AppPool\DefaultAppPool:(OI)(CI)RX"

Hỗ trợ HTTP/2

HTTP/2 được hỗ trợ với ASP.NET Core trong các tình huống triển khai IIS sau:

HTTP/2 được bật theo mặc định. Kết nối sẽ fall back về HTTP/1.1 nếu kết nối HTTP/2 không được thiết lập.

Application Initialization Module và Idle Timeout

Khi được hosted trong IIS bởi ASP.NET Core Module phiên bản 2:

Application Initialization Module

Áp dụng cho ứng dụng được hosted in-process và out-of-process.

IIS Application Initialization là tính năng IIS gửi HTTP request đến ứng dụng khi app pool khởi động hoặc được tái chế.

Sử dụng web.config, thêm phần tử <applicationInitialization> với doAppInitAfterRestart đặt thành true:

xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <applicationInitialization doAppInitAfterRestart="true" />
    </system.webServer>
  </location>
</configuration>

Idle Timeout

Chỉ áp dụng cho các ứng dụng được hosted in-process.

Để ngăn ứng dụng idle, hãy đặt idle timeout của app pool bằng IIS Manager:

  1. Chọn Application Pools trong panel Connections.
  2. Click chuột phải vào app pool của ứng dụng trong danh sách và chọn Advanced Settings.
  3. Idle Time-out (minutes) mặc định là 20 phút. Đặt thành 0 (không). Chọn OK.
  4. Tái chế worker process.

Vị trí file Module, Schema và Configuration

Module

IIS (x86/amd64):

IIS Express (x86/amd64):

Schema

IIS:

IIS Express:

Configuration

IIS:

IIS Express:

Shadow Copy (Sao chép bóng)

Shadow copying (sao chép bóng) các assembly của ứng dụng vào ASP.NET Core Module (ANCM) cho IIS có thể mang lại trải nghiệm người dùng tốt hơn so với việc dừng ứng dụng khi triển khai.

Khi ứng dụng ASP.NET Core đang chạy trên Windows, các binary bị khóa nên không thể sửa đổi hoặc thay thế. Shadow copy cho phép các assembly của ứng dụng được cập nhật trong khi ứng dụng đang chạy bằng cách tạo bản sao của các assembly.

Shadow copy không nhằm mục đích cho phép triển khai zero-downtime, vì vậy IIS vẫn sẽ tái chế ứng dụng và một số request có thể nhận được phản hồi 503 Service Unavailable.

Tùy chỉnh cài đặt handler ANCM trong web.config để bật shadow copy:

xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore"/>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".logsstdout">
      <handlerSettings>
        <handlerSetting name="enableShadowCopy" value="true" />
        <!-- Đảm bảo IIS ApplicationPool identity có quyền truy cập thư mục này -->
        <handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
      </handlerSettings>
    </aspNetCore>
  </system.webServer>
</configuration>