Windows Server 2025 / 安装 IIS 并在实验环境发布静态 HTML 页面
在 Windows Server 2025 安装 Web 服务器角色和静态内容功能后,IIS 就能提供 HTML 页面。还需要配置物理路径、应用程序池、绑定与读取权限,再分别从 WEB1 本机和独立客户端验证。
准备独立 Web 服务器
Internet Information Services(IIS,Internet 信息服务)是 Windows 的 Web 服务器。本课提供静态文件,服务器直接返回 HTML,不需要数据库或应用框架。PHP 和 ASP.NET 还需要各自的运行环境与部署设置,不要为本例额外安装它们。
准备隔离实验网络中的独立域成员服务器 WEB1,使用带桌面体验的 Windows Server 2025,不要在 DC1 或 FS1 上增加角色。示例地址为 172.24.50.30/24,DNS 指向 DC1 的 172.24.50.10,并已加入 ad.example.test。先确认地址未被占用且分配给该服务器、域网络与 DNS 正常、主机资源足够。不要为解决这些前提而把实验环境连接到生产网络。
在 WEB1 使用管理员 Windows PowerShell 和 IIS 管理器。新建对象是 LabSite、LabSitePool、C:\Sites\LabSite,以及 HTTP 8080 端口。先检查现有站点、池、目录、规则与绑定;如果名称或目标已经使用,应停止而不替换。与默认站点的 80 端口绑定分开,不将服务器暴露到互联网。本课 HTTP 只传送不含秘密的测试文本,不是传输凭据的安全通道。
安装 IIS 并核对必要功能
- 在服务器管理器选择管理 → 添加角色和功能,使用基于角色的安装,并将 WEB1 选为目标。继续前核对服务器。
- 选择 Web 服务器(IIS)及必要管理工具。本课使用桌面体验的本地控制台;Server Core 需要另一种管理方式。
- 在常见 HTTP 功能检查静态内容、默认文档,在运行状况和诊断检查 HTTP 日志,并核对 IIS 管理控制台。
- 检查摘要后安装,不增加与本页无关的应用运行环境,也不要为了省事选择全部功能。
- 查看安装结果与重启要求。如需重启,先安排并完成,再核对状态后继续。通过 inetmgr 打开 IIS 管理器。
PowerShell 替代方式应在 WEB1 本机运行。若 IIS 已存在,先检查功能状态与站点用途。Install-WindowsFeature 需要管理员权限,默认不安装管理工具,因此这里使用 IncludeManagementTools。两行分别执行,遇到错误就停止。角色安装成功并不会自动配置路径、权限或网络访问:
Install-WindowsFeature Web-Server -IncludeManagementTools
Get-WindowsFeature Web-Static-Content,Web-Default-Doc,Web-Http-Logging,Web-Mgmt-Console
预期安装成功,且 Get-WindowsFeature 中 Web-Static-Content、Web-Default-Doc、Web-Http-Logging、Web-Mgmt-Console 均为 Installed,同时查看 RestartNeeded。Available 尚未满足条件,应返回向导仅安装缺少的功能,再次确认。存在管理控制台,并不证明提供页面所需的功能已经全部安装。
创建页面和独立应用程序池
如果 C:\Sites\LabSite 已存在,应停止并确认其用途,不覆盖文件。不存在时才创建目录,将下面的完整文档以 UTF-8 保存为 index.html。在记事本保存时选择“所有文件”,并在资源管理器显示扩展名,确认实际文件不是 index.html.txt。示例保留英文内容和 lang="en",其中的句子可用来识别真正响应请求的站点:
<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>LabSite</title></head>
<body><h1>Windows Server 2025 web server lab</h1><p>This page is served by LabSite on WEB1.</p></body>
</html>
- 在 IIS 管理器 → 应用程序池,只有名称空闲时才创建 LabSitePool。如果已有同名池或用于其他任务,应停止而不替换。
- 本课只有静态页面,.NET CLR 版本选择“无托管代码”(No Managed Code)。该选项不会安装 PHP 或其他运行环境。
- 在池的高级设置确认 Identity = ApplicationPoolIdentity,不要改用管理员账户。
- 打开 C:\Sites\LabSite 的属性 → 安全,将位置选为 WEB1,添加 IIS AppPool\LabSitePool 并检查名称。如果无法解析,检查本机位置及池名称是否存在。
- 为目录和文件授予读取和执行、列出文件夹内容、读取,保留 SYSTEM 与管理员权限,不给 Web 进程写入或完全控制。
应用程序池标识是关联该池的虚拟账户,不是需要在域里手动创建的用户。应用程序池将应用组织到 IIS 工作进程中,本例使用独立池。发布管理员的写权限与 Web 进程的读权限应分开;提供这张页面不需要给池管理员权限、写权限或完全控制。不要照搬通用示例中的过大授权,应确认读取权限覆盖 index.html,且没有拒绝项阻止它。
配置站点与匿名标识
- 在网站 → 添加网站填写 LabSite,选择 LabSitePool,并将物理路径设为 C:\Sites\LabSite。确认不是误选了自动创建的其他池。
- 类型选 http,IP 为 172.24.50.30,端口 8080,主机名留空。确认 WEB1 确实拥有该 IP,且没有其他绑定或服务使用同一组合。
- 在 LabSite → 身份验证 → 匿名身份验证确认已启用,选择编辑,再选择应用程序池标识,只修改测试站点。
- 在 LabSite → 默认文档确认已启用,列表中有 index.html;仅在缺少时添加,不启用目录浏览。
- 复核绑定、路径、池及其状态,然后启动站点。启动失败时保存错误消息并解决具体冲突,不停止其他站点。
默认匿名用户 IUSR 与池标识不是同一个账户。在匿名身份验证设置中明确选择应用程序池标识,才能使本页请求与之前授予 IIS AppPool\LabSitePool 的文件权限匹配。同时确认 LabSite 的匿名身份验证已启用。不要通过给 Everyone 写权限或修改整个服务器配置来掩盖身份验证错误。
在 WEB1 浏览器打开 http://172.24.50.30:8080/index.html,再打开 http://172.24.50.30:8080/。预期显示标题 Windows Server 2025 web server lab 和句子 This page is served by LabSite on WEB1.,而不是默认站点欢迎页或以 file:// 打开的本地副本。根 URL 能返回页面,需要 index.html 确实存在并已列为默认文档。New-Website 参考文档也说明了路径、端口和池参数;若已使用向导,就不要重复创建同一个站点。
验证客户端访问并分析响应
先确认 WEB1 实验网卡使用域防火墙配置文件,再打开 wf.msc → 入站规则 → 新建规则 → 端口 → TCP、本地端口 8080 → 允许连接 → 仅“域”。名称未被使用时命名为 Lab-IIS-HTTP-8080,随后在属性 → 作用域将远程 IP 地址限制为 172.24.50.0/24,并复核端口与配置文件。防火墙规则筛选条件区分本地端口和远程来源。配置文件不符合预期时应排查 DNS 与域连接,而不是改成所有配置文件或关闭防火墙。也要检查是否已有其他规则或策略允许更大范围。
在允许子网中的 CLIENT1 执行下方测试,再用浏览器打开两个 URL。TcpTestSucceeded: True 只说明到该端口的 TCP 连接建立成功,不代表 HTML 内容、权限或目标站点正确。若为 False,先检查网络路径、配置文件、规则与监听端口,不要先更改站点凭据:
Test-NetConnection -ComputerName 172.24.50.30 -Port 8080
| 现象 | 检查内容 |
|---|---|
| 连接超时 | 网络路径、防火墙配置文件与规则、监听端口及允许范围。 |
| 403.14 | 默认文档文件及其配置;不要通过启用目录浏览绕过问题。 |
| 401.3 | 实际匿名标识,以及目录和文件的 NTFS 读取权限。 |
| 404 | 物理路径、文件名和扩展名;先看子状态码,不要把所有 404 都归因为文件不存在。 |
| 503 | 池状态、快速失败保护和事件;不要通过关闭保护掩盖故障。 |
在 IIS 管理器的 LabSite → 高级设置查看站点 ID,在 LabSite → 日志确认实际目录。使用默认位置时,根据客户端、URL 和时间对应 C:\inetpub\logs\LogFiles\W3SVC 后接站点 ID 的目录,并确认日志格式的时区。IIS HTTP 错误诊断区分状态码与子状态码。没有到达 IIS 的请求可能不出现在其日志中,应把网络故障与 HTTP 响应问题分开。清理时先保留所需日志,只停止并移除 LabSite;确认 LabSitePool 没有其他应用使用后,再移除该池与新规则。只有目录中全部是自己的可丢弃测试文件时才删除目录,保留默认站点、其他规则与共享角色。




