ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

Windows Server 2022 Web服务器搭建:IIS、DNS与防火墙完整指南

Windows Server 2022 Web服务器搭建:IIS、DNS与防火墙完整指南

简介:这份资源面向IT运维人员、系统管理员及计算机相关专业学生,聚焦Windows Server 2022环境下Web服务器的完整搭建与配置流程,帮助读者掌握从系统安装到网站上线的关键技能。资源包内含1个docx文档,压缩包大小约1016KB,以图文步骤说明的形式组织内容,便于按章节对照操作。文档围绕服务器安装、服务器功能测试、挂载网站到服务器站点、网址与IP地址的域名解析等模块展开,涵盖安装介质准备、语言与时区选择、磁盘分区、网络与硬件测试、网站目录创建、素材拷贝、端口与域名配置、DNS服务器安装及记录配置等具体知识点,并附有排错与验证思路。目前已有2765人学习下载,适合需要快速上手Windows服务器Web部署、查漏补缺或作为实验参考的读者使用。

1. Windows Server 2022 Web 服务器搭建:从裸机到能访问的完整路径

很多人第一次接触 Windows Server 2022 的 Web 服务器搭建,都以为装完 IIS 就完事了,结果浏览器一打开就是 404 或者 500,回头查半天发现是端口冲突或者 DNS 没配。这套环境在企业内网、实验室演示、小型业务系统里太常见了,装不好直接影响后续所有联调。我见过最典型的翻车场景:网站素材拷进去了,IIS 也显示运行中,但外部机器就是访问不了,最后发现是 Windows 防火墙把 80 端口拦了,而默认规则里根本没有放行。这篇文章面向的是需要从零把 Windows Server 2022 变成一台能对外提供 Web 服务的机器的人,不管你是刚入行的运维还是临时被拉来搭环境的后端,照着走完就能跑通。

2. 安装前的环境确认:版本、角色与网络规划

2.1 版本选择与硬件底线

Windows Server 2022 分 Standard 和 Datacenter 两个主要版本,Web 服务器场景下 Standard 完全够用,除非你要跑大量虚拟机或容器。安装介质从 Microsoft 官方渠道获取,不要用来路不明的镜像,否则后续激活和更新都会出玄学问题。硬件方面,我一般建议至少 2 核 CPU、4GB 内存、40GB 系统盘,如果网站素材多或者要跑数据库,内存直接上 8GB 以上。磁盘分区时系统盘留 60GB 以上,因为 IIS 日志和 Windows 更新会慢慢吃掉空间。

安装类型选「自定义」,不要选「升级」,除非你明确知道自己在做什么。分区阶段如果服务器只有一块盘,直接全部给系统盘;如果有数据盘,网站目录可以单独挂载,方便后续迁移和备份。安装过程中会让你设置 Administrator 密码,这个密码必须满足复杂度要求,大小写字母、数字、符号至少三类,否则装到一半卡住还得重来。

2.2 安装完成后的基础检查

系统装完第一次进桌面,先别急着装 IIS。打开「服务器管理器」,确认几个事情:网络适配器是否识别、IP 地址是否配置正确、时间时区是否对。我习惯先用ping测一下网关通不通,再用nslookup看 DNS 解析是否正常。如果服务器在域环境里,还要确认是否已经加域,因为后续 DNS 服务器的配置和域环境有耦合。

# 查看当前网络配置 ipconfig /all # 测试到网关的连通性,假设网关是 192.168.1.1 ping 192.168.1.1 # 测试 DNS 解析,假设要解析 www.example.local nslookup www.example.local

ipconfig /all会列出所有网卡的详细信息,重点看 IPv4 地址、子网掩码、默认网关和 DNS 服务器。ping通网关说明二层和三层基本没问题,如果 ping 不通先检查网线、交换机端口和 IP 配置。nslookup如果返回非权威应答,说明 DNS 配置正确;如果超时,后面配 DNS 服务器时就要特别注意。

2.3 安装 IIS 角色与必要功能

IIS 不是默认安装的,需要手动添加角色。打开「服务器管理器」→「添加角色和功能」→ 一路下一步到「服务器角色」→ 勾选「Web 服务器 (IIS)」。在弹出的功能列表里,我一般会额外勾选这几项:ASP.NET 4.8、.NET Extensibility 4.8、ISAPI 扩展、ISAPI 筛选器、请求筛选、HTTP 重定向、静态内容压缩。如果你要跑 PHP 或者 Node.js,对应的 CGI 和 FastCGI 也要勾上。

# 用 PowerShell 安装 IIS 及常用功能 Install-WindowsFeature -Name Web-Server -IncludeManagementTools Install-WindowsFeature -Name Web-Asp-Net45, Web-Net-Ext45, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Redirect, Web-Stat-Compression

Install-WindowsFeature是 Windows Server 上装角色的标准命令,-IncludeManagementTools会把 IIS 管理器一起装上,省得后面找不到图形界面。第二行把 ASP.NET 4.5、ISAPI 扩展和筛选器、HTTP 重定向、静态压缩都带上,这些在部署实际网站时大概率会用到。装完不需要重启,但建议重启一次让所有组件加载完整。

3. 挂载网站到 IIS:目录、端口与应用程序池

3.1 创建网站目录与拷贝素材

网站目录不要放在C:\inetpub\wwwroot下面,那个是默认站点用的,混在一起后面排查问题很麻烦。我一般会在数据盘或者系统盘根目录建一个C:\WebSites,然后按站点名建子目录,比如C:\WebSites\Portal。把网站素材拷进去之后,检查一下目录权限:IIS 的工作进程账户IIS_IUSRS需要至少「读取和执行」权限,如果网站要写文件,还得给「修改」权限。

# 创建网站目录 New-Item -Path "C:\WebSites\Portal" -ItemType Directory # 拷贝网站素材,假设素材在 D:\Source\Portal Copy-Item -Path "D:\Source\Portal\*" -Destination "C:\WebSites\Portal" -Recurse # 授予 IIS_IUSRS 读取权限 icacls "C:\WebSites\Portal" /grant "IIS_IUSRS:(OI)(CI)(RX)"

New-Item建目录,Copy-Item带-Recurse把子目录一起拷过去。icacls是 Windows 上改权限的命令,(OI)(CI)表示对象继承和容器继承,(RX)是读取和执行。如果网站需要上传文件或者写日志,把(RX)换成(M)给修改权限,但不要给「完全控制」,最小权限原则在 Web 服务器上尤其重要。

3.2 在 IIS 中新建站点并绑定端口

打开 IIS 管理器,右键「网站」→「添加网站」。站点名称填一个能认出来的,物理路径选刚才建的目录,绑定类型选 http,IP 地址选「全部未分配」或者指定服务器 IP,端口默认 80。如果 80 已经被默认站点占了,要么先停掉默认站点,要么给新站点换端口,比如 8080。端口不能重复使用,这是硬规则,IIS 启动时会直接报错。

# 停掉默认站点,释放 80 端口 Stop-WebSite -Name "Default Web Site" # 新建站点,绑定 80 端口 New-WebSite -Name "Portal" -PhysicalPath "C:\WebSites\Portal" -Port 80 -Force

Stop-WebSite停掉默认站点,New-WebSite新建站点,-Port 80指定端口,-Force表示如果同名站点存在就覆盖。如果不想停默认站点,把-Port改成 8080 或其他未占用端口,但访问时就要带端口号。生产环境里我一般会把默认站点停掉或者删掉,避免混淆。

3.3 应用程序池配置与 .NET 版本选择

应用程序池是 IIS 里隔离不同站点运行环境的关键机制。默认情况下新站点会用一个自动创建的应用程序池,但最好手动建一个,方便控制 .NET 版本和管道模式。如果网站是 ASP.NET 4.x 写的,.NET CLR 版本选 v4.0,管道模式选「集成」;如果是老旧的 ASP.NET 2.0 或者经典 ASP,管道模式要选「经典」。

# 新建应用程序池 New-WebAppPool -Name "PortalPool" # 设置 .NET 版本和管道模式 Set-ItemProperty -Path "IIS:\AppPools\PortalPool" -Name managedRuntimeVersion -Value "v4.0" Set-ItemProperty -Path "IIS:\AppPools\PortalPool" -Name managedPipelineMode -Value "Integrated" # 把站点关联到应用程序池 Set-ItemProperty -Path "IIS:\Sites\Portal" -Name applicationPool -Value "PortalPool"

New-WebAppPool建池,Set-ItemProperty改配置。managedRuntimeVersion设成v4.0对应 .NET 4.x,如果网站是 .NET Core 或 Node.js,这个值要设成空字符串,因为不走 CLR。managedPipelineMode选Integrated是大多数现代 ASP.NET 应用的推荐值,老应用如果报 500 错误可以试试改成Classic。

4. DNS 服务器安装与域名解析配置

4.1 安装 DNS 服务器角色

网站光有 IP 和端口还不够,用户记不住 IP,得有个域名。Windows Server 2022 自带的 DNS 服务器角色就能干这事。在「服务器管理器」里添加角色,勾选「DNS 服务器」,一路下一步装完。装完之后 DNS 管理器会自动出现在「工具」菜单里。如果服务器是域控,DNS 可能已经装好了,不用重复装。

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

Install-WindowsFeature装 DNS 角色,-IncludeManagementTools把 DNS 管理器一起装上。装完不需要重启,但 DNS 服务会自动启动。如果提示需要重启,重启一次再继续。

4.2 创建正向解析区域与 A 记录

正向解析就是把域名转成 IP。打开 DNS 管理器,右键「正向查找区域」→「新建区域」→ 选「主要区域」→ 区域名称填你的域名,比如example.local。创建完之后在区域里右键「新建主机 (A 或 AAAA)」,名称填www,IP 地址填服务器的 IP。这样www.example.local就会解析到服务器 IP。

# 新建正向查找区域 Add-DnsServerPrimaryZone -Name "example.local" -ZoneFile "example.local.dns" # 新建 A 记录 Add-DnsServerResourceRecordA -Name "www" -ZoneName "example.local" -IPv4Address "192.168.1.100"

Add-DnsServerPrimaryZone建主要区域,-ZoneFile指定区域文件名,不指定也会自动生成。Add-DnsServerResourceRecordA建 A 记录,-Name是主机名,-ZoneName是区域名,-IPv4Address是服务器 IP。建完之后用nslookup www.example.local验证,如果返回 192.168.1.100 就说明解析生效了。

4.3 客户端 DNS 指向与解析测试

服务器本身的 DNS 配好了,但客户端还得把 DNS 指向这台服务器。在客户端的网络适配器设置里,把首选 DNS 改成服务器的 IP。如果客户端和服务器在同一个域里,域控的 DNS 通常会自动下发,不用手动改。改完之后ipconfig /flushdns清一下缓存,再ping www.example.local,如果能 ping 通并且解析到正确 IP,说明整条链路通了。

# 客户端清 DNS 缓存 ipconfig /flushdns # 测试域名解析 nslookup www.example.local # 测试 HTTP 访问 curl -I http://www.example.local

ipconfig /flushdns清掉本地 DNS 缓存,避免旧记录干扰。nslookup确认解析结果。curl -I只取 HTTP 响应头,如果返回200 OK或者403 Forbidden,说明 Web 服务器已经响应了;如果返回Could not resolve host,说明 DNS 还没生效;如果返回Connection refused,说明 IIS 没监听或者防火墙拦了。

5. 避坑与排查:端口、权限、防火墙的常见翻车点

5.1 端口冲突导致站点启动失败

现象:IIS 里新建站点后,站点状态显示「已停止」,手动启动报错「另一个程序正在使用此文件,进程无法访问」。

原因:80 端口已经被其他程序占用,最常见的是默认站点没停,或者装了 Apache、Nginx 之类的软件抢了端口。

解决:先用netstat -ano | findstr :80找到占用端口的进程 PID,再用tasklist | findstr <PID>看是哪个程序。如果是默认站点,停掉或者删掉;如果是其他软件,改它的端口或者卸掉。确认端口释放后再启动站点。

# 查看 80 端口占用情况 netstat -ano | findstr :80 # 假设 PID 是 1234,查看对应进程 tasklist | findstr 1234

5.2 防火墙拦截导致外部无法访问

现象:服务器本机用http://localhost能打开网站,但其他机器访问 IP 或域名就是超时。

原因:Windows 防火墙默认没有放行 80 端口,IIS 装完之后也不会自动加规则。

解决:在「高级安全 Windows Defender 防火墙」里新建入站规则,放行 TCP 80 端口。或者用 PowerShell 命令直接加。

# 放行 80 端口入站 New-NetFirewallRule -DisplayName "HTTP-80" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow

New-NetFirewallRule建规则,-Direction Inbound是入站,-Protocol TCP是 TCP 协议,-LocalPort 80是本地端口,-Action Allow是允许。如果网站用了 8080 或其他端口,把-LocalPort改成对应端口。

5.3 应用程序池权限不足导致 500 错误

现象:网站能打开静态页面,但一访问动态页面就报 500 Internal Server Error,事件查看器里能看到「访问被拒绝」或「权限不足」。

原因:应用程序池的账户没有网站目录的读取权限,或者没有临时目录的写入权限。

解决:确认应用程序池用的账户是ApplicationPoolIdentity还是自定义账户。如果是ApplicationPoolIdentity,给IIS AppPool\PortalPool这个虚拟账户授权。另外 ASP.NET 临时目录C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files也需要写入权限。

# 给应用程序池账户授权 icacls "C:\WebSites\Portal" /grant "IIS AppPool\PortalPool:(OI)(CI)(RX)" # 给 ASP.NET 临时目录授权 icacls "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files" /grant "IIS AppPool\PortalPool:(OI)(CI)(M)"

5.4 DNS 解析不生效或解析到错误 IP

现象:nslookup返回的 IP 不对,或者直接超时。

原因:DNS 区域文件没配好,A 记录写错了 IP,或者客户端 DNS 指向了错误的服务器。

解决:在 DNS 管理器里检查正向查找区域的 A 记录,确认 IP 和服务器实际 IP 一致。客户端用ipconfig /all确认 DNS 服务器地址。如果服务器有多块网卡,DNS 可能监听在错误的网卡上,在 DNS 管理器属性里把监听 IP 限制为正确的那个。

5.5 网站素材路径错误导致 404

现象:IIS 里站点显示运行中,但访问任何页面都是 404 Not Found。

原因:物理路径填错了,或者默认文档没配。IIS 默认会找index.html、default.aspx这些文件,如果网站入口文件名不在默认列表里,就会 404。

解决:在 IIS 管理器里双击站点的「默认文档」,把网站的实际入口文件加进去,比如home.html或者app.aspx。同时确认物理路径指向的目录里确实有这些文件。

6. 装完怎么验证:从本机到跨机的完整检查清单

装完 IIS、挂好站点、配完 DNS 之后,别急着交付。我一般会按这个顺序走一遍验证,每一步都过了才算真正跑通。

第一步,服务器本机验证。打开浏览器访问http://localhost,如果能看到网站首页,说明 IIS 和站点配置没问题。如果本机都打不开,先查 IIS 里站点是否启动、应用程序池是否运行、物理路径是否正确。这一步是最基础的,本机不通后面都不用试。

第二步,用 IP 访问。在服务器本机浏览器里访问http://192.168.1.100(换成你的服务器 IP),如果本机用 IP 能打开但 localhost 打不开,说明 IIS 绑定可能只绑了某个特定 IP。如果本机 IP 也打不开,检查 IIS 绑定里 IP 地址是不是选了「全部未分配」。

第三步,跨机访问。找另一台同网段的机器,先ping 192.168.1.100确认网络通,再用浏览器访问http://192.168.1.100。如果 ping 通但浏览器打不开,大概率是防火墙拦了 80 端口,回到 5.2 加规则。如果 ping 都不通,检查交换机、VLAN 和路由。

第四步,域名访问。在客户端把 DNS 指向服务器 IP,ipconfig /flushdns之后nslookup www.example.local确认解析到正确 IP,然后浏览器访问http://www.example.local。如果解析对但访问超时,还是防火墙问题;如果解析不对,回 DNS 管理器检查 A 记录。

第五步,检查 IIS 日志。IIS 默认日志在C:\inetpub\logs\LogFiles下面,按站点和日期分目录。如果前面都通了但某些页面报错,日志里能看到具体的 HTTP 状态码和请求路径。我习惯用Get-Content直接看最新日志,或者用 Excel 打开慢慢分析。

# 查看最新 IIS 日志 Get-ChildItem "C:\inetpub\logs\LogFiles" -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 5 # 查看某个日志文件的内容 Get-Content "C:\inetpub\logs\LogFiles\W3SVC1\20250101.log" -Tail 50

Get-ChildItem按修改时间倒序列出日志文件,-Recurse递归子目录。Get-Content的-Tail 50只看最后 50 行,适合快速定位最近的请求。日志里sc-status字段是 HTTP 状态码,cs-uri-stem是请求路径,time-taken是处理时间,这几个字段排查问题最有用。

第六步,压力测试。如果网站要对外提供服务,用ab或者curl循环请求一下,看 IIS 能不能扛住。Windows 上可以用 PowerShell 的Invoke-WebRequest循环跑。

# 简单压力测试,循环请求 100 次 1..100 | ForEach-Object { $response = Invoke-WebRequest -Uri "http://www.example.local" -UseBasicParsing Write-Output "Request $_ : $($response.StatusCode)" }

Invoke-WebRequest发 HTTP 请求,-UseBasicParsing跳过 IE 引擎解析,速度更快。循环 100 次看状态码是否都是 200,如果有超时或 500,说明应用程序池或者后端代码有问题。

从那以后我每次搭完 Windows Server 2022 的 Web 服务器,都会强制走一遍这六步验证,尤其是跨机访问和 DNS 解析这两步,最容易在交付后翻车。希望帮到你。

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

RELATED READING

延伸阅读

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