ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows Server 2022 上搭建 IIS 与 DNS 的完整指南

Windows Server 2022 上搭建 IIS 与 DNS 的完整指南

简介:这份文档面向IT运维人员与Windows服务器初学者,系统讲解Windows Server 2022环境下Web服务器的搭建与配置流程,帮助读者从零完成服务器安装到网站对外访问的完整实践。内容涵盖操作系统安装、服务器功能测试、网站目录创建与素材拷贝、端口与域名配置,以及DNS服务器安装和域名解析测试等关键环节,并附有各步骤要点提示,便于对照操作与排查问题。资源包共1个docx文件,约1016KB,以图文步骤形式组织,适合作为实验指导或日常运维参考手册。目前已有2767人学习下载,说明其在Windows服务器入门与实操场景中具有较高参考价值,读者可据此快速掌握Web站点部署与域名解析的基本方法。

1. 从一台刚装完系统的空服务器说起

上周帮一个朋友处理他公司内网的一台测试机,系统是 Windows Server 2022,装完 IIS 之后浏览器访问http://localhost直接 404,他以为是 IIS 没装好,重装了三次,最后发现是默认站点被停用、网站文件也没拷到wwwroot下。这种翻车在 Windows 服务器上太常见了——系统装完不等于 Web 服务能用,IIS 角色装完也不等于站点能访问,中间还隔着目录权限、端口占用、防火墙入站规则、DNS 解析这几道坎。这篇笔记按我自己的部署习惯,把 Windows Server 2022 上搭 Web 服务器(IIS + DNS)的完整链路走一遍:装系统、验功能、挂站点、配端口、做域名解析,每一步给出可抄的命令和参数,最后落到怎么验证真的跑通。适合刚接触 Windows 服务器、需要在内网或测试环境快速起一个站点的开发者,也适合想理清 IIS 站点与 DNS 记录对应关系的老手对照版本差异。

2. 装系统与选版本:Windows Server 2022 的安装介质和分区取舍

2.1 版本选择:Standard 还是 Datacenter,桌面体验还是核心安装

Windows Server 2022 的安装镜像里通常同时带 Standard 和 Datacenter 两个版本,以及「服务器核心」和「带桌面体验」两种安装选项。做 Web 服务器,我一般选Standard + 桌面体验:Standard 足够跑 IIS 和 DNS,Datacenter 的授权成本对一台测试机没必要;桌面体验虽然多占几百 MB 内存和磁盘,但图形化的服务器管理器、IIS 管理器对排查站点问题太省事,纯核心安装只适合已经脚本化运维的场景。

安装介质从微软官方渠道获取 ISO,校验 SHA256 后再挂载,这一步别省——镜像损坏导致的安装中断,报错信息往往指向磁盘而不是镜像,很容易误判。启动安装程序后按提示选语言、时区、接受许可协议,到「选择安装类型」时选「自定义:仅安装 Windows(高级)」,因为我们要自己规划分区。

2.2 分区规划:系统盘和数据盘分开

分区这一步是血泪经验:系统盘和数据盘一定分开。我见过太多把网站文件直接放 C 盘、结果系统盘写满导致 IIS 日志写不进去、站点假死的案例。常见做法是给系统盘 100~120 GB,剩下的空间单独划一个数据盘(比如 D 盘),网站目录、日志、备份都放数据盘。

安装程序里新建分区时,系统盘留足空间,其余未分配空间先不处理,进系统后再用磁盘管理初始化成数据盘。格式化选 NTFS,这是 IIS 和权限体系的原生文件系统,别用 exFAT 或 FAT32——后者不支持大于 4 GB 的单文件和细粒度 ACL 权限。

安装过程会重启数次,期间不要拔介质。装完后第一次登录要求设置管理员密码,密码策略默认较严(长度、复杂度、不能含用户名),设一个符合策略的强密码并记下来,后面远程和 IIS 配置都要用。

2.3 装完先做的三件事:改名、打补丁、开远程

系统装完别急着装 IIS,先做三件基础事。第一,改计算机名,用有意义的名称(比如web-test-01),改完重启生效:

# 以管理员身份打开 PowerShell Rename-Computer -NewName "web-test-01" -Restart

-NewName是新的计算机名,-Restart表示改完立即重启。计算机名会影响后面 DNS 记录和证书的规划,早改早省事。

第二,装系统更新。Windows Server 2022 的累积更新里包含 IIS 相关组件的安全修复,装完系统先跑一遍更新,避免后面站点起来了才发现某个组件版本有已知问题。图形界面走「设置 → 更新和安全」,或者用命令:

# 安装 PSWindowsUpdate 模块后检查并安装更新 Install-Module PSWindowsUpdate -Force Get-WindowsUpdate -Install -AcceptAll -AutoReboot

-AcceptAll表示接受所有更新,-AutoReboot允许自动重启。生产环境建议先看更新列表再决定,测试机可以一把梭。

第三,按需开启远程桌面,方便后续从办公机操作:

# 开启远程桌面并放行防火墙规则 Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0 Enable-NetFirewallRule -DisplayGroup "远程桌面"

第一条把注册表里禁用远程桌面的开关置 0,第二条放行「远程桌面」这个防火墙规则组。注意远程桌面默认端口 3389,内网测试够用,暴露到公网前务必评估。

3. 装 IIS 角色:用 PowerShell 一次装全 Web 服务器组件

3.1 为什么用命令行装而不是点向导

服务器管理器里「添加角色和功能」的向导当然能装 IIS,但向导的勾选项多、容易漏,而且没法复用。我习惯用 PowerShell 的Install-WindowsFeature一次装全,命令本身就是文档,换台机器复制粘贴就行。IIS 的核心角色名是Web-Server,但只装它的话,静态页面能跑,ASP.NET、管理控制台、常见 HTTP 功能都缺,站点一挂就报 500 或 404.3。

3.2 一条命令装齐 Web 服务器角色和常用子功能

# 安装 IIS 核心角色及常用子功能 Install-WindowsFeature -Name Web-Server, ` Web-WebServer, ` Web-Common-Http, ` Web-Default-Doc, ` Web-Dir-Browsing, ` Web-Http-Errors, ` Web-Static-Content, ` Web-Http-Redirect, ` Web-Health, ` Web-Http-Logging, ` Web-Performance, ` Web-Stat-Compression, ` Web-Security, ` Web-Filtering, ` Web-App-Dev, ` Web-Net-Ext45, ` Web-Asp-Net45, ` Web-ISAPI-Ext, ` Web-ISAPI-Filter, ` Web-Mgmt-Tools, ` Web-Mgmt-Console ` -IncludeManagementTools

-Name后面跟角色和子功能名,反引号是 PowerShell 的续行符。几个关键项说明:Web-Default-Doc提供默认文档(index.html、default.aspx 等),Web-Static-Content处理静态文件,Web-Http-Logging开日志(排错全靠它),Web-Filtering是请求筛选(限制文件扩展名和 HTTP 方法),Web-Asp-Net45和Web-Net-Ext45是 .NET 4.5+ 的 ASP.NET 支持,Web-Mgmt-Console就是 IIS 管理器图形界面。-IncludeManagementTools确保管理控制台一起装上。

装完命令会返回一个结果表,看Success列是否为True。如果某个子功能名拼错,整条命令会失败并提示找不到功能名,这时用Get-WindowsFeature Web-*列出所有可用名称对照。

3.3 验证 IIS 是否真的在跑

装完别只看向导的「安装成功」,要验证服务状态和默认页面:

# 查看 W3SVC 服务状态和默认站点响应 Get-Service W3SVC Invoke-WebRequest -Uri "http://localhost" -UseBasicParsing | Select-Object StatusCode

W3SVC是 IIS 的万维网发布服务,状态应为Running。Invoke-WebRequest请求本机 80 端口,正常返回StatusCode 200并带 IIS 默认欢迎页内容。如果返回 404,先别怀疑安装,去C:\inetpub\wwwroot看有没有iisstart.htm,再看 IIS 管理器里 Default Web Site 是否处于「已启动」状态——这就是开头那个朋友踩的坑,默认站点被停用,装多少次都没用。

提示:Invoke-WebRequest在部分老版本 PowerShell 里需要-UseBasicParsing才能在没有 IE 引擎的环境下正常解析,加上更稳。

4. 挂载站点:目录、权限、端口三件事一次配对

4.1 建站点目录并拷贝网站素材

先在数据盘建站点根目录,按站点名分目录,方便以后一台服务器挂多个站:

# 在数据盘创建站点目录 New-Item -ItemType Directory -Path "D:\sites\demo" -Force # 把网站素材从临时目录拷贝进去(示例源路径按实际替换) Copy-Item -Path "E:\upload\demo-site\*" -Destination "D:\sites\demo" -Recurse -Force

-Force允许覆盖已存在目录,-Recurse递归拷贝子目录。素材拷完用Get-ChildItem D:\sites\demo确认首页文件(如index.html)在根目录下,IIS 的默认文档是按名称匹配的,首页藏在子目录里就会 404。

4.2 用 PowerShell 建站点并指定端口

IIS 管理器里「添加网站」能建,但命令行建站更利于记录参数。核心是New-WebSite:

# 新建站点,绑定 8080 端口,指定物理路径和应用池 New-WebAppPool -Name "demo-pool" New-WebSite -Name "demo" ` -PhysicalPath "D:\sites\demo" ` -Port 8080 ` -ApplicationPool "demo-pool" ` -Force

-Port 8080是站点监听端口,同一台服务器上端口不能重复,80 被默认站点占了,新站要么换端口,要么先停默认站点。-ApplicationPool指定独立应用池,站点之间隔离,一个池崩了不影响另一个。-Force表示同名站点存在时覆盖重建。

端口选择上,内网测试用 8080、8081 这类高位端口最省事,避开 80、443 和系统保留端口。如果确实要用 80,先Stop-WebSite -Name "Default Web Site"停掉默认站点,再建新站绑 80。

4.3 目录权限:IIS_IUSRS 和应用池身份

站点建好但访问 401 或 500.19,十有八九是权限问题。IIS 的工作进程身份需要读权限,常见做法是给站点目录授予IIS_IUSRS组的读取和执行权限:

# 授予 IIS_IUSRS 组对站点目录的读取和执行权限 $acl = Get-Acl "D:\sites\demo" $rule = New-Object System.Security.AccessControl.FileSystemAccessRule( "IIS_IUSRS", "ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow") $acl.SetAccessRule($rule) Set-Acl -Path "D:\sites\demo" -AclObject $acl

ReadAndExecute是读取和执行权限,ContainerInherit,ObjectInherit让权限继承到子目录和文件。如果站点需要写文件(上传、日志),再单独给应用池身份(如IIS AppPool\demo-pool)加修改权限,别图省事给Everyone完全控制——这是内网测试机最常见的权限滥用。

4.4 防火墙放行站点端口

本机能访问不代表别的机器能访问,Windows 防火墙默认拦入站。给 8080 端口加一条入站规则:

# 放行 TCP 8080 入站 New-NetFirewallRule -DisplayName "IIS Demo 8080" ` -Direction Inbound ` -Protocol TCP ` -LocalPort 8080 ` -Action Allow

-Direction Inbound是入站,-LocalPort 8080对应站点端口,-Action Allow放行。改端口时记得同步改这条规则,否则会出现「本机通、外部不通」的玄学现象。

5. 域名解析:装 DNS 服务器并配 A 记录

5.1 装 DNS 角色

内网环境没有公网 DNS 可用时,在服务器上装 DNS 角色,把域名解析到本机 IP:

# 安装 DNS 服务器角色 Install-WindowsFeature -Name DNS -IncludeManagementTools

装完 DNS 服务会自动启动,用Get-Service DNS确认状态为Running。DNS 角色和 IIS 可以装在同一台机器上,测试环境够用;生产环境通常分开,避免单点。

5.2 建正向查找区域和 A 记录

假设服务器内网 IP 是192.168.10.20,要给站点配域名demo.internal,先建正向查找区域,再加 A 记录:

# 建正向查找区域(主区域) Add-DnsServerPrimaryZone -Name "internal" -ZoneFile "internal.dns" # 添加 A 记录,把 demo.internal 解析到服务器 IP Add-DnsServerResourceRecordA -Name "demo" -ZoneName "internal" -IPv4Address "192.168.10.20"

Add-DnsServerPrimaryZone建的是主区域,-ZoneFile指定区域文件名。Add-DnsServerResourceRecordA的-Name "demo"加上区域名就是完整域名demo.internal,-IPv4Address指向站点所在服务器。如果站点端口不是 80,访问时要带端口,比如http://demo.internal:8080——DNS 只负责域名到 IP 的转换,不处理端口。

5.3 客户端指向这台 DNS 并验证解析

在需要访问站点的机器上,把 DNS 服务器地址改成192.168.10.20,然后验证:

# 验证域名解析 Resolve-DnsName -Name "demo.internal" -Server "192.168.10.20"

-Server指定查询的 DNS 服务器,返回结果里IPAddress应为192.168.10.20。解析通了但网页打不开,回到第 4 章查端口和防火墙;解析不通,查 DNS 区域是否建对、客户端 DNS 是否指向正确。

6. 避坑与排查:五个装 IIS 时最容易翻车的点

6.1 现象:浏览器 404,但 IIS 管理器显示站点已启动

原因通常是默认文档没配或首页文件名不在默认列表里。IIS 默认文档列表包含Default.htm、index.html、iisstart.htm等,如果你的首页叫home.html,访问根路径就会 404。解决:在 IIS 管理器站点「默认文档」里加一条,或用命令Add-WebConfigurationProperty -PSPath 'IIS:\Sites\demo' -Filter 'system.webServer/defaultDocument/files' -Name "." -Value @{value='home.html'}追加。

6.2 现象:访问报 500.19,错误码指向配置文件

原因是web.config里用了未安装的模块或权限不足。先看错误页里的「配置错误」具体节点,常见是 URL 重写模块没装(Web-Http-Redirect不含 URL Rewrite,需要单独装),或者web.config所在目录的 NTFS 权限没给IIS_IUSRS读权限。解决:补装对应模块,或按 4.3 节重新授目录权限。

6.3 现象:本机能访问,局域网其他机器访问超时

原因是防火墙没放行站点端口,或者服务器网络配置文件是「公用」导致规则不生效。解决:按 4.4 节加New-NetFirewallRule,并用Get-NetFirewallProfile确认当前网络配置文件的入站策略。测试机常把网络设为「专用」,规则才按预期生效。

6.4 现象:站点端口改了,访问还是旧页面

原因是浏览器缓存或 DNS 缓存。先ipconfig /flushdns清 DNS 缓存,再用无痕窗口访问;如果站点绑定了多个端口,确认 IIS 管理器里「绑定」列表只保留了新端口,旧端口绑定没删会导致请求落到旧配置。

6.5 现象:DNS 记录加了,客户端解析不到

原因是客户端 DNS 没指向这台服务器,或者区域名和查询名不匹配。用Resolve-DnsName -Name "demo.internal" -Server "192.168.10.20"直连查询能通、客户端默认查询不通,就是客户端 DNS 配置问题;直连也不通,检查 A 记录的-Name是否多写了区域后缀(-Name "demo.internal"加-ZoneName "internal"会变成demo.internal.internal)。

7. 装完怎么验证:从本机到跨机的一次完整走查

站点和 DNS 都配完后,别只在本机浏览器点一下就算完,按「本机 → 同网段另一台机器 → 域名访问」三层走一遍,才能确认整条链路通。我一般按下面这个顺序验:

验证层级命令/操作期望结果
IIS 服务Get-Service W3SVCRunning
本机 IP 访问Invoke-WebRequest http://192.168.10.20:8080200,返回站点首页
本机域名访问Invoke-WebRequest http://demo.internal:8080200,内容同上
跨机 IP 访问另一台机器浏览器访问http://192.168.10.20:8080页面正常
跨机域名访问另一台机器Resolve-DnsName demo.internal后访问解析到正确 IP,页面正常
日志确认Get-Content C:\inetpub\logs\LogFiles\W3SVC*\*.log -Tail 5有对应请求记录

跨机验证时如果 IP 能通、域名不通,问题一定在 DNS 侧;域名能解析但页面打不开,问题在端口或防火墙。日志是最后的黑匣子,W3SVC日志目录下按站点 ID 分文件夹,请求的时间、客户端 IP、状态码都在里面,404 和 500 一眼能看出来。

还有一个容易忽略的点:验证完把默认站点停掉或删掉,避免 80 端口被占、以后建新站绑 80 时冲突。我习惯在验证通过后执行Stop-WebSite -Name "Default Web Site",并在文档里记下这台机器上已占用的端口清单,下次加站点前先对照。

从那以后我每次搭完 IIS,都强制走一遍「服务状态 → 本机 IP → 本机域名 → 跨机 IP → 跨机域名 → 日志」这条链,任何一环断了就停在那一步查,不再靠重启和重装碰运气。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进