IIS由浅入深

admin2026-07-25 20:40:368661

IIS(Internet Information Services)

📑 目录

第一阶段:IIS 基础入门

第二阶段:网站部署与配置

第三阶段:核心架构与请求处理管道

第四阶段:应用程序池深度管理

第五阶段:高级功能与扩展

第六阶段:性能调优、安全加固与运维

第一阶段:IIS 基础入门

1.1 什么是 IIS?

IIS(Internet Information Services)是微软 Windows Server 系统内置的 Web 服务器软件套件,深度集成于 Windows 生态。它不仅能托管网站(HTTP/HTTPS),还集成了 FTP 服务、SMTP 邮件服务、WebDAV 内容协作等功能。[citation:1][citation:5]

1.2 IIS 版本演进

版本

发布时间

关键特性

IIS 5

2000年

支持 ASP 动态页面

IIS 7

2008年

模块化架构重构,管道模型革新

IIS 8

2012年

支持 SNI(多站点 SSL)、动态 IP 限制

IIS 10

2016年

HTTP/2 支持、与 Windows Server 2016+ 深度整合

1.3 安装 IIS

通过服务器管理器安装(GUI):

服务器管理器 → 添加角色和功能 → 选择"Web 服务器(IIS)" → 勾选所需功能

通过 PowerShell 安装(推荐):

Install-WindowsFeature -Name Web-Server -IncludeManagementTools

⚠️ Windows Server 2025 全新安装时,IIS 并非默认安装,需手动添加。[citation:1]

建议同时勾选的模块:

静态内容压缩

请求筛选

应用程序请求路由缓存(ARR)

URL 重写模块

输出缓存

1.4 IIS 管理工具

工具

用途

IIS 管理器(inetmgr)

图形化管理界面,最常用

appcmd.exe

命令行管理工具

PowerShell(WebAdministration 模块)

自动化运维、批量操作

MMC 证书控制台

管理 SSL 证书

第二阶段:网站部署与配置

2.1 核心概念四要素

┌─────────────────────────────────────────────┐

│ 网站 (Site) │

│ ┌───────────────────────────────────────┐ │

│ │ 应用程序 (Application) │ │

│ │ ┌─────────────────────────────────┐ │ │

│ │ │ 虚拟目录 (Virtual Dir) │ │ │

│ │ │ └── 映射到物理路径 D:\web\blog │ │ │

│ │ └─────────────────────────────────┘ │ │

│ └───────────────────────────────────────┘ │

│ 应用程序池:AppPool_Blog (w3wp.exe) │

└─────────────────────────────────────────────┘

概念

说明

网站(Site)

顶层容器,以 IP + 端口 + 主机头 唯一标识

应用程序(Application)

网站的逻辑子集,拥有独立的配置和应用程序池

虚拟目录(Virtual Directory)

逻辑路径映射到物理文件夹,可跨磁盘位置

应用程序池(Application Pool)

工作进程(w3wp.exe)的隔离容器,提供进程级隔离

2.2 创建第一个网站

步骤:

IIS 管理器 → 右键"网站" → "添加网站"

配置参数:

参数

说明

示例

网站名称

便于管理识别

MyWebSite

物理路径

网站文件存放目录

D:\websites\myapp

绑定类型

HTTP / HTTPS

http

IP 地址

选择"全部未分配"或指定 IP

全部未分配

端口

HTTP 默认 80,HTTPS 默认 443

80

主机名

域名(不填则匹配所有)

www.example.com

点击"确定" → 网站启动

2.3 默认文档配置

默认文档决定了访问 / 时 IIS 返回哪个文件。

操作: 选中站点 → 双击"默认文档" → 确保 index.html、Default.aspx、index.aspx 在列表中且排序靠前。

如果未配置默认文档且未启用目录浏览,访问 / 将返回 403.14 Forbidden。[citation:8][citation:10]

2.4 权限配置(高频重点)

IIS 访问文件系统依赖 NTFS 权限,这是最常见的报错根源之一。

场景

所需权限

配置方式

静态网站只读访问

读取 & 执行

给 IIS_IUSRS 或 IUSR 赋予读取权限

.NET 应用写日志/上传

修改 / 写入

给应用程序池标识账户写入权限

web.config 保护

只读

设置为只读,防止运行时篡改

配置步骤:

右键网站目录 → 属性 → 安全 → 编辑

添加 IIS_IUSRS → 勾选"读取和执行"、"列出文件夹内容"、"读取"

如需写入,额外勾选"修改"

🔑 核心原则: 遵循最小权限原则,不要给"完全控制"权限。[citation:2][citation:10]

2.5 防火墙与端口

Windows 防火墙配置:

# 开放 HTTP/HTTPS 端口

New-NetFirewallRule -DisplayName "HTTP (80)" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow

New-NetFirewallRule -DisplayName "HTTPS (443)" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow

☁️ 云服务器特别注意: 除了 Windows 防火墙,还需在云平台的安全组中放行端口。很多人在云上部署失败就是因为只开了本地防火墙,忘了安全组。[citation:2]

第三阶段:核心架构与请求处理管道

3.1 IIS 分层架构

┌─────────────────────────────────────────────────┐

│ 客户端 (浏览器) │

└──────────────────┬──────────────────────────────┘

│ HTTP 请求

┌─────────────────────────────────────────────────┐

│ HTTP.sys(内核模式监听) │ ← 内核态 (Ring 0)

│ • 监听端口 80/443 │

│ • 协议解析、请求队列管理 │

│ • 内核级静态内容缓存 │

└──────────────────┬──────────────────────────────┘

│ 转发请求

┌─────────────────────────────────────────────────┐

│ WAS (Windows Process Activation Service) │ ← 用户态

│ • 管理应用程序池生命周期 │

│ • 按需启动/回收 w3wp.exe │

└──────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────┐

│ w3wp.exe(工作进程) │

│ ┌───────────────────────────────────────────┐ │

│ │ 请求处理管道 (Pipeline) │ │

│ │ 认证 → 授权 → 缓存 → Handler 执行 │ │

│ │ → 响应生成 → 日志 │ │

│ └───────────────────────────────────────────┘ │

└─────────────────────────────────────────────────┘

三大核心组件:

HTTP.sys:内核级监听器,高性能、低延迟,直接运行在操作系统内核态[citation:20]

WAS(Windows Process Activation Service):负责管理工作进程的创建、回收和生命周期

w3wp.exe:用户态工作进程,实际执行请求处理

3.2 请求处理管道详解

请求在 IIS 中经过一个有序的事件链处理,每个事件都可以被模块(Module)拦截和处理。

客户端请求 → HTTP.sys → WAS → w3wp.exe

┌───────────────────────────────────┐

│ BeginRequest │ ← 请求开始

│ AuthenticateRequest │ ← 身份验证

│ AuthorizeRequest │ ← 授权检查

│ ResolveRequestCache │ ← 缓存命中?

│ AcquireRequestState │ ← 获取 Session

│ PreRequestHandlerExecute │ ← Handler 执行前

│ ★ HttpHandler 执行 ★ │ ← 生成响应

│ PostRequestHandlerExecute │ ← Handler 执行后

│ ReleaseRequestState │ ← 释放状态

│ UpdateRequestCache │ ← 更新缓存

│ EndRequest │ ← 请求结束

│ PreSendRequestHeaders │

│ PreSendRequestContent │

└───────────────────────────────────┘

响应返回客户端

事件

典型用途

BeginRequest

URL 重写、初始化、CORS 头设置

AuthenticateRequest

身份验证(Windows Auth、Forms Auth、JWT)

AuthorizeRequest

权限检查(角色、策略)

ResolveRequestCache

输出缓存命中判断

PreRequestHandlerExecute

在 Handler 执行前最后干预

HttpHandler

实际处理请求、生成响应(如 ASP.NET 页面)

EndRequest

日志记录、资源清理、异常处理

3.3 集成模式 vs 经典模式

对比维度

集成模式(Integrated)

经典模式(Classic)

架构

IIS + ASP.NET 管道完全统一

IIS 6.0 兼容,ISAPI 桥接

性能

✅ 更高(无额外桥接开销)

❌ 较低

功能覆盖

所有文件类型均可使用 ASP.NET 功能

仅 .NET 请求走托管管道

模块干预

HttpModule 可拦截所有请求

HttpModule 仅干预 .NET 请求

兼容性

新项目首选

遗留系统迁移兼容

默认推荐

✅ IIS 7+ 默认且推荐

仅用于旧版应用兼容

💡 最佳实践: 新项目一律使用集成模式。经典模式仅用于无法升级的遗留应用。[citation:12][citation:24]

3.4 IIS 模块体系

模块类型

代表模块

功能

HTTP 模块

CustomErrorModule

错误响应、重定向

安全模块

WindowsAuthentication / FormsAuthentication

身份验证

内容模块

StaticFileModule / DefaultDocumentModule

静态文件处理、默认文档

压缩模块

StaticCompressionModule / DynamicCompressionModule

内容压缩

缓存模块

OutputCacheModule / FileCacheModule

响应缓存

日志模块

HttpLoggingModule

请求日志记录

托管支持模块

ManagedEngine

桥接原生管道与 .NET 运行时

第四阶段:应用程序池深度管理

4.1 应用程序池的本质

应用程序池是 IIS 中进程隔离的核心机制。每个应用程序池运行在独立的 w3wp.exe 进程中,一个池的崩溃不会影响其他池。[citation:1][citation:13]

┌────────────────────────────────────────────┐

│ 应用程序池 A (DefaultAppPool) │ → w3wp.exe (PID: 1234)

│ ├── 网站1 (www.site1.com) │

│ └── 网站2 (www.site2.com) │

├────────────────────────────────────────────┤

│ 应用程序池 B (MyAppPool) │ → w3wp.exe (PID: 5678)

│ └── 应用 (api.example.com) │

└────────────────────────────────────────────┘

4.2 应用程序池关键配置

配置项

说明

推荐值

.NET CLR 版本

托管代码的运行时版本

根据应用选择(.NET 4.x 选 v4.0)

托管管道模式

Integrated / Classic

Integrated(新项目)

启用 32 位应用程序

兼容 32 位 DLL

按需开启,默认 False

标识(Identity)

工作进程运行账户

ApplicationPoolIdentity(推荐)

闲置超时

无请求多久后回收

开发环境 20 分钟,生产可调大

固定时间间隔回收

定期重启工作进程

默认 1740 分钟(29 小时)

4.3 回收机制深度解析

回收(Recycling)是 IIS 用新进程替换旧进程的机制,不是重启 IIS 服务本身。[citation:13]

回收触发条件一览

触发类型

默认值

说明

固定时间间隔

1740 分钟(29 小时)

自上次启动后按时间触发

指定时间

每日固定时间点触发(如 02:00)

私有内存限制

0(不启用)

工作进程 Private Bytes 超阈值

虚拟内存限制

0(不启用)

虚拟地址空间超限

请求数量

0(不启用)

累计处理请求数达到阈值

空闲超时

20 分钟

无新请求持续该时间后回收

配置变更

自动启用

web.config 等变更时触发

重叠回收(Overlapped Recycling)

IIS 默认启用重叠回收,流程如下:

时间线:

T0: 触发回收条件

T1: IIS 启动新的 w3wp.exe(新进程初始化)

T2: 新进程就绪,开始接收新请求

T3: 旧进程继续处理进行中的请求(排空期 Draining)

T4: 旧进程在 shutdownTimeLimit(默认 90 秒)内完成 → 优雅退出

T5: 若 T4 超时仍未退出 → IIS 强制终止(TerminateProcess)

回收对应用的影响

影响维度

具体表现

应对策略

内存状态丢失

静态变量、MemoryCache、单例对象重建

使用 Redis / Memcached 等外部缓存

Session 中断

InProc Session 数据清空

切换至 StateServer 或 SQLServer 模式

冷启动延迟

JIT 编译、依赖初始化导致首请求慢

启用 Application Initialization 模块预热

数据库连接池重建

短暂连接等待

设置合理 connectionTimeout + 连接池预热

4.4 快速故障保护(Rapid-Fail Protection)

默认配置:5 分钟内失败 5 次 → 应用程序池自动禁用,返回 503 错误。[citation:15]

这是 IIS 的自我保护机制,防止崩溃循环无限消耗服务器资源。

调整方法: 应用程序池 → 高级设置 → Rapid-Fail 保护 → 调整阈值(但不建议完全禁用)。

第五阶段:高级功能与扩展

5.1 URL 重写(URL Rewrite)

URL 重写是 IIS 最强大的扩展模块之一,常用于 SEO 优化、伪静态、HTTP→HTTPS 强制跳转等场景。[citation:38]

常见应用场景

场景

规则类型

示例

伪静态

重写(Rewrite)

/product/123 → /product.aspx?id=123

域名重定向

重定向(Redirect)

http://example.com → https://example.com

防盗链

阻止(Abort)

非本站引用图片返回 403

屏蔽恶意请求

阻止

无 Host 头的请求直接拒绝

配置示例:HTTP 强制跳转 HTTPS

5.2 身份验证体系

认证方式

安全性

适用场景

特点

匿名身份验证

公开网站

使用 IUSR 账户,无需凭据

基本身份验证

⭐⭐

简单内部系统

Base64 编码(非加密),必须配合 HTTPS

Windows 身份验证

⭐⭐⭐⭐

企业内部系统

集成 AD 域,支持 Kerberos / NTLM,用户无感知登录

表单身份验证

⭐⭐⭐

自定义登录页面

ASP.NET 经典方案,灵活可控

证书身份验证

⭐⭐⭐⭐⭐

高安全场景

基于 SSL 客户端证书,最强身份验证

📌 选择建议:

公网网站 → 匿名 + 表单认证

企业内网 → Windows 身份验证(集成域)

API 服务 → Windows Auth 或 Token(JWT)

高安全 → 证书认证[citation:31][citation:35]

5.3 压缩与缓存

静态内容压缩

IIS 管理器 → 点击服务器节点 → 双击"压缩"

☑ 启用静态内容压缩(推荐)

☑ 启用动态内容压缩(按需,注意 CPU 开销)

压缩级别配置(web.config):

实测开启压缩后,静态资源响应速度可提升 60% 以上。[citation:4][citation:32]

输出缓存

IIS 管理器 → 服务器节点 → 双击"输出缓存" → 编辑功能设置

☑ 启用缓存

☑ 启用内核缓存(Kernel Cache)

最大缓存响应大小:默认根据内存自动调整

按文件类型配置缓存规则(web.config):

5.4 HTTPS / SSL 证书配置

步骤:

申请证书:从 CA(如 Let's Encrypt、DigiCert)获取证书(PFX 格式含私钥)

导入证书:IIS 管理器 → 服务器节点 → 服务器证书 → 导入 PFX

绑定 HTTPS:站点 → 编辑绑定 → 添加 → 类型 HTTPS / 端口 443 / 选择证书

强制 HTTPS:站点 → SSL 设置 → 勾选"要求 SSL"(可选,通常配合 URL 重写做 301 跳转)

SNI 支持(IIS 8+):

同一服务器上多个站点使用不同 SSL 证书 → 启用 SNI(Server Name Indication)

在绑定中勾选"需要服务器名称指示"并指定主机名[citation:14][citation:18]

5.5 FTP 服务配置

IIS 内置 FTP 服务器功能,适合文件上传下载场景。

关键配置点:

端口:默认 21(控制连接),被动模式需开放数据端口范围

用户隔离:防止用户访问其他用户目录

权限:按用户/组分别设置读写权限

安全:建议禁用匿名 FTP,使用 FTP over SSL(FTPS)

第六阶段:性能调优、安全加固与运维

6.1 性能调优 Checklist

优化项

操作

预期效果

应用程序池回收策略

禁用固定时间回收 + 设置内存阈值 + 指定非高峰回收

避免无意义重启,减少冷启动

启用输出缓存

内核缓存 + 用户缓存双开

静态资源命中缓存,零磁盘 I/O

启用压缩

静态 + 动态压缩

减少传输体积 60%+

应用程序初始化

安装预热模块,回收后自动预热

消除冷启动延迟

CPU 亲和性

多核服务器上绑定应用池 CPU

减少上下文切换

连接数限制

调整 maxConcurrentRequestsPerCPU

防止单站点耗尽资源

日志优化

按站点分离日志 + 定期归档

减少磁盘 I/O 竞争

推荐的应用程序池配置(4 核服务器):

2147483648

6.2 安全加固 Checklist

加固项

操作

❶ 修改默认站点路径

将站点从 C:\inetpub\wwwroot 移至非系统分区(如 D:\websites)

❷ 最小权限原则

站点目录不给"完全控制",仅赋予必要权限

❸ 删除不必要 MIME 类型

移除 .aspx、.php 等不需要的处理映射

❹ 禁用目录浏览

防止目录结构泄露

❺ 启用请求筛选

限制文件扩展名、URL 长度、查询字符串长度

❻ 配置 IP 限制

限制/允许特定 IP 访问

❼ 卸载不必要服务

不用 FTP/SMTP 就卸载,减少攻击面

❽ 禁用 WebDAV

非必需则禁用,防止未授权文件操作

❾ 定期更新证书

避免证书过期导致服务中断

❿ 禁用 SSLv3/TLS 1.0

仅启用 TLS 1.2+,禁用弱加密算法

⓫ web.config 只读

防止运行时被篡改

⓬ 定期检查 applicationHost.config 哈希

检测配置是否被篡改

6.3 日志与监控

IIS 日志体系

日志类型

路径

用途

IIS 访问日志

%SystemDrive%\inetpub\logs\LogFiles\W3SVCx

记录所有 HTTP 请求

HTTPERR 日志

%SystemDrive%\Windows\System32\LogFiles\HTTPERR

记录被拒绝/失败的请求

事件查看器

Windows 日志 → System / Application

WAS、W3SVC 相关事件

失败请求跟踪(FREB)

按需启用,配置跟踪规则

诊断 400-600 状态码的详细请求流程

关键性能计数器(PerfMon)

计数器

关注指标

Process\Private Bytes (w3wp)

工作进程内存占用

ASP.NET Applications\Requests/Sec

每秒请求数

Web Service\Current Connections

当前活跃连接数

.NET CLR Memory\# Bytes in all Heaps

.NET 托管堆大小

HTTP Service Request Queues\CurrentQueueSize

请求队列堆积情况

6.4 常见错误速查表

状态码

典型原因

排查步骤

401.1

身份验证凭据被拒绝

检查是否启用对应认证方式、凭据是否有效

401.2

Kerberos SPN 或委派问题

检查 SPN 注册和委派信任设置

403.14

无默认文档且目录浏览禁用

添加默认文档或启用目录浏览

404.0

文件或路由不存在

检查物理路径、URL 重写规则

404.13

请求正文超过限制

增大 web.config 中 maxAllowedContentLength

500.0

应用代码/模块异常

查看应用程序事件日志、启用 FREB

500.19

web.config 格式错误/权限不足

验证 XML 语法、检查文件权限

500.21

处理程序映射到未安装模块

安装对应模块(如 ASP.NET Core 模块)

503

应用池停止/队列满/快速故障保护

检查应用池状态、httperr.log、事件查看器

📊 学习路线图总结

Level 1 (1-2周) ▶ 安装 IIS、创建网站、理解站点/应用/虚拟目录/应用池四要素

▶ 掌握权限配置、默认文档、防火墙

Level 2 (2-4周) ▶ 理解请求处理管道、集成模式 vs 经典模式

▶ 掌握身份验证体系(匿名/Windows/表单/基本)

Level 3 (1-2周) ▶ 应用程序池深度配置与回收策略

▶ 快速故障保护、重叠回收机制

Level 4 (2-3周) ▶ URL 重写、压缩、输出缓存、HTTPS/SSL

▶ FTP 配置、请求筛选、IP 限制

Level 5 (持续) ▶ 性能调优(缓存策略、预热、内存监控)

▶ 安全加固(最小权限、证书管理、日志审计)

▶ 自动化运维(PowerShell、批量管理)

📚 参考资源:

Microsoft Learn - IIS 官方文档

IIS.net 官方社区

RFC 2616 / 7230(HTTP 协议规范)