Windows Server 2022 搭建 Web 服务器:IIS 选型、域名解析与安全配置实战
简介这份资源面向IT运维人员、系统管理员及计算机相关专业学生聚焦Windows Server 2022环境下Web服务器的完整搭建与配置流程帮助读者掌握从系统安装到网站上线的关键技能。压缩包内共1个docx文档约1016KB内容围绕服务器安装、功能测试、网站挂载与域名解析四大模块展开涵盖安装介质准备、语言时区选择、分区格式化、网络与硬件测试、网站目录创建、素材拷贝、端口与域名配置以及DNS服务器安装、记录配置和解析测试等具体操作要点结构清晰便于按步骤对照实践。目前已有2759人学习下载适合需要快速上手Windows服务器Web部署、查漏补缺或作为教学参考的初、中级技术人员可作为搭建企业内网站点或个人实验环境的实用指南。1. Windows Server 2022 上把 Web 服务器跑起来先想清楚你要的是 IIS 还是别的很多人在 Windows Server 2022 上搭 Web 服务器第一反应是“装个 IIS 就完事”结果上线没两天就翻车静态页面能开ASP.NET 一访问就 500.19或者外网域名解析到服务器 IP 了但浏览器一直转圈。问题往往不在 IIS 本身而在于你跳过了“角色选型”和“DNS 解析链路”这两步。这篇笔记就按一线落地的顺序把 Windows Server 2022 上搭 Web 服务器这件事拆开先确认用 IIS 还是 Nginx for Windows再装角色、配站点、绑域名、做 DNS 解析最后把安全基线调到一个能见人的状态。适合手里有一台刚装好的 Windows Server 2022、准备对外提供 HTTP/HTTPS 服务的运维或后端同学也适合需要在内网搭测试平台的人。2. 选型与前置准备IIS、Nginx 还是 Kestrel别等装完才后悔2.1 三种常见 Web 服务器在 Windows Server 2022 上的适用边界在 Windows Server 2022 上跑 Web 服务常见做法有三种IIS、Nginx for Windows、以及把 ASP.NET Core 的 Kestrel 直接暴露或套 IIS。选型不是看谁名气大而是看你的技术栈和运维习惯。IIS 是 Windows Server 的原生角色和 Windows 身份验证、证书存储、事件日志、性能计数器集成得最顺。如果你的站点是 ASP.NET、ASP.NET Core、或者需要 Windows 身份验证、需要图形化管理多个站点和应用程序池IIS 是默认答案。它的坑在于模块加载顺序和权限配置错了报错信息不够直白。Nginx for Windows 适合静态资源为主、或者你团队本来就熟 Nginx 配置、想复用 Linux 上的 conf 文件。但 Windows 版 Nginx 在高并发下的表现和 Linux 版有差距而且作为服务运行需要额外用工具包装官方并不推荐在生产环境重度使用。Kestrel 是 ASP.NET Core 自带的跨平台 Web 服务器性能好、配置在代码里。常见做法是 Kestrel 监听本地端口前面用 IIS 做反向代理这样既能用 IIS 管证书和站点又能吃到 Kestrel 的性能。如果你只是内网跑一个 API 测试平台直接 Kestrel 监听端口也能用但对外生产环境不建议裸奔。提示如果标题里明确是“Windows Server 2022 web 服务器”且没有指定技术栈默认按 IIS 讲因为它是这个系统上最标准、资料最全的路径。下面所有操作都以 IIS 为主线Nginx 和 Kestrel 作为对比出现。2.2 装 IIS 之前必须确认的四件事装角色之前先把这四件事确认掉能省掉后面一半的排错时间。第一服务器有没有固定 IP。Web 服务器对外提供服务IP 频繁变会导致 DNS 解析记录失效。在“网络和共享中心”里把 IPv4 设成静态或者确认 DHCP 保留已经绑好 MAC。第二防火墙入站规则有没有放行 80 和 443。Windows Server 2022 默认的 Windows Defender 防火墙会拦掉入站 HTTP/HTTPSIIS 装完后如果没自动加规则外网访问就是超时。可以先用New-NetFirewallRule手动加后面章节会给命令。第三计算机名和域名规划。如果你打算用主机头Host Header区分多个站点服务器本身不需要加入域也能做但 DNS 记录要提前想好是用 A 记录直接指 IP还是用 CNAME 指到另一个域名。CNAME 域名解析在免费 DNS 服务里很常见适合把www指到主域名但注意 CNAME 不能和 MX 记录冲突。第四磁盘分区。IIS 默认日志在C:\inetpub\logs站点内容如果也放 C 盘系统盘写满会直接拖垮服务器。常见做法是单独挂一块数据盘站点根目录放D:\sites\下面日志也改到数据盘。2.3 用 PowerShell 装 IIS 角色和常用功能图形界面装 IIS 不是不行但一线更习惯用 PowerShell因为可重复、可写进部署脚本。下面这条命令装的是最常用的组合Web-Server 核心、静态内容、默认文档、HTTP 错误、ASP.NET 4.8、ISAPI 扩展、管理控制台。# 以管理员身份打开 PowerShell Install-WindowsFeature -Name Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Asp-Net45, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Mgmt-Console, Web-Windows-Auth -IncludeManagementTools逻辑说明Install-WindowsFeature是 Windows Server 上装角色的标准 cmdlet。Web-Server是 IIS 核心不装它其他都白搭。Web-Static-Content和Web-Default-Doc让 IIS 能返回 HTML、图片和默认首页。Web-Asp-Net45是 .NET Framework 4.8 的 ASP.NET 支持很多老系统还跑在这个上面。Web-Windows-Auth用于内网需要域账号认证的场景不需要可以去掉。-IncludeManagementTools会带上 IIS 管理器方便后面图形化检查。参数怎么改如果你只跑静态站可以只装Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Mgmt-Console。如果跑 ASP.NET CoreWeb-Asp-Net45不是必须的但Web-ISAPI-Ext和Web-ISAPI-Filter通常要留着因为 ASP.NET Core Module 会用到。装完后验证浏览器打开http://localhost看到 IIS 默认欢迎页就说明角色装好了。如果 404检查C:\inetpub\wwwroot下有没有iisstart.htm。3. 建站点、绑域名、做 DNS 解析让外网能通过域名访问3.1 用 PowerShell 建站点并指定应用程序池图形界面建站点很简单但如果你要批量或者写进部署文档PowerShell 更靠谱。下面这段先建应用程序池再建站点站点根目录指向D:\sites\demo绑定 80 端口主机头留空后面再绑域名。# 建应用程序池.NET CLR 版本用 v4.0管道模式用 Integrated New-WebAppPool -Name demoPool Set-ItemProperty -Path IIS:\AppPools\demoPool -Name managedRuntimeVersion -Value v4.0 Set-ItemProperty -Path IIS:\AppPools\demoPool -Name managedPipelineMode -Value Integrated # 建站点根目录 New-Item -ItemType Directory -Path D:\sites\demo -Force # 建站点绑定 80 端口物理路径指向 D:\sites\demo New-Website -Name demo -Port 80 -PhysicalPath D:\sites\demo -ApplicationPool demoPool逻辑说明New-WebAppPool建独立应用程序池避免多个站点共用一个池导致一个崩全崩。managedRuntimeVersion设成v4.0是给 .NET Framework 4.x 用的如果跑 ASP.NET Core这里可以设成No Managed Code因为 Core 不依赖 .NET Framework 运行时。managedPipelineMode用Integrated是默认推荐Classic只在老系统兼容时用。New-Website的-Port 80是 HTTP 默认端口-PhysicalPath是站点根目录。建完后用Get-Website能看到状态是 Started。3.2 绑定域名主机头、A 记录和 CNAME 的配合站点建好后默认用 IP 就能访问。但你要用域名访问需要在 IIS 里绑主机头同时在 DNS 里加解析记录。这两步缺一不可。IIS 绑主机头# 给 demo 站点加一个主机头为 www.example.com 的 80 端口绑定 New-WebBinding -Name demo -Protocol http -Port 80 -HostHeader www.example.com逻辑说明New-WebBinding给已有站点加绑定。-HostHeader就是浏览器里输入的域名。一台服务器上多个站点共用 80 端口时IIS 靠主机头区分请求该给哪个站点。如果主机头留空这个绑定会接收所有没匹配到其他主机头的请求容易和默认站点冲突。DNS 解析这边常见做法是主域名example.com用 A 记录直接指向服务器公网 IPwww用 CNAME 指向example.com。CNAME 域名解析的好处是主域名 IP 变了只需要改 A 记录www不用动。很多免费 DNS 服务都支持这种配法。注意CNAME 记录不能和 MX 记录同时存在于同一个主机名上。如果你example.com既要收邮件又要做 CNAME会冲突。所以主域名用 A 记录www用 CNAME 是更稳的做法。验证解析是否生效在服务器上或本地用nslookup www.example.com看返回的 IP 是不是服务器公网 IP。如果返回的是 CDN 或别的 IP说明解析还没生效或者被缓存了。DNS 解析生效时间取决于 TTL常见 600 秒改记录后等 10 分钟再试。3.3 用 hosts 文件在本地先验证再动 DNSDNS 改一次要等排错时很烦。一线常用做法是先在本地 hosts 文件里把域名指到服务器 IP验证 IIS 绑定和站点内容没问题再去改 DNS。这样能把“IIS 配置问题”和“DNS 解析问题”分开。Windows 上 hosts 文件在C:\Windows\System32\drivers\etc\hosts用管理员权限编辑加一行203.0.113.10 www.example.com逻辑说明203.0.113.10换成你服务器真实 IP。加完后ping www.example.com应该返回这个 IP。浏览器访问http://www.example.com如果能看到站点内容说明 IIS 主机头绑定和站点本身没问题剩下就是 DNS 的事了。如果 hosts 指了还访问不了先查 IIS 绑定和防火墙别急着改 DNS。4. 避坑与排查IIS 搭 Web 服务器最常见的五个翻车点4.1 现象外网访问超时内网 localhost 正常原因Windows Defender 防火墙没放行 80/443 入站。IIS 装完后防火墙规则不一定自动加尤其是你手动装角色或者用了精简镜像。解决用 PowerShell 加规则然后确认规则生效。New-NetFirewallRule -DisplayName HTTP-80-In -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow New-NetFirewallRule -DisplayName HTTPS-443-In -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow加完后Get-NetFirewallRule -DisplayName HTTP-80-In看 Enabled 是不是 True。如果服务器前面还有云厂商的安全组安全组也要放行这个不在 Windows 里容易漏。4.2 现象ASP.NET 页面报 500.19错误代码 0x80070021原因IIS 的 ASP.NET 相关模块没装全或者应用程序池的托管管道模式不对。常见于只装了 Web-Server 核心没装Web-Asp-Net45和Web-ISAPI-Ext。解决补装功能然后重启 IIS。Install-WindowsFeature -Name Web-Asp-Net45, Web-ISAPI-Ext, Web-ISAPI-Filter iisreset如果补装后还报检查应用程序池的managedRuntimeVersion是不是v4.0以及站点的处理程序映射里有没有ASP.NET v4.0的映射。缺映射的话在 IIS 管理器里“处理程序映射”里恢复。4.3 现象域名解析到 IP 了但浏览器打开是别的站点原因IIS 里有多个站点绑定 80 端口其中一个绑定的主机头为空或者默认站点还在运行抢占了没有匹配主机头的请求。解决检查所有站点的绑定把不需要的默认站点停掉确保每个站点的主机头明确。Get-WebBinding | Select-Object ItemXPath, protocol, bindingInformation看bindingInformation里有没有*:80:这种主机头为空的绑定。如果有要么给它加主机头要么停掉对应站点。默认站点Default Web Site如果不用直接Stop-Website Default Web Site。4.4 现象静态图片能开但 CSS/JS 加载 404原因MIME 类型没注册。IIS 默认只认常见扩展名.woff2、.json、.webp这些新格式可能没在列表里。解决加 MIME 类型。可以在 IIS 管理器里点也可以用 PowerShell。Add-WebConfigurationProperty -PSPath IIS:\ -Filter system.webServer/staticContent -Name . -Value {fileExtension.woff2; mimeTypefont/woff2} Add-WebConfigurationProperty -PSPath IIS:\ -Filter system.webServer/staticContent -Name . -Value {fileExtension.json; mimeTypeapplication/json}逻辑说明Add-WebConfigurationProperty往staticContent节里加条目。fileExtension是扩展名mimeType是标准 MIME。加完不用重启 IIS刷新页面就行。如果还 404看浏览器开发者工具里请求的 URL 是不是路径写错了别只盯着 MIME。4.5 现象服务器 CPU 和内存正常但网站响应越来越慢原因IIS 日志把系统盘写满了或者应用程序池回收设置不合理导致频繁重启。Windows Server 2022 默认日志在C:\inetpub\logs\LogFiles访问量大时增长很快。解决把日志目录改到数据盘并设置日志滚动。在 IIS 管理器里选中服务器节点打开“日志”把目录改成D:\logs\iis。同时检查应用程序池的回收设置默认是 1740 分钟回收一次如果内存泄漏严重可以改成固定时间回收但别设太短否则每次回收都有几秒不可用。# 查看应用程序池回收设置 Get-ItemProperty -Path IIS:\AppPools\demoPool -Name recycling.periodicRestart.time如果这个值很小比如 00:05:00说明每 5 分钟回收一次太频繁。改成1.00:00:00表示一天一次。5. 安全基线与 HTTPS让 Web 服务器不只是“能跑”5.1 用 win-acme 申请 Lets Encrypt 证书并自动续期HTTP 站点上线后下一步就是 HTTPS。Windows Server 2022 上常见做法是用 win-acme 这个开源工具申请 Lets Encrypt 证书它能自动续期省掉手动换证书的麻烦。这里不写具体下载地址只说流程下载 win-acme 后解压以管理员身份运行wacs.exe按提示选“Create certificate (full options)”绑定 IIS 站点选域名验证方式用 HTTP 验证需要 80 端口可访问完成后它会自动在 IIS 里绑 443 并设置续期计划任务。注意Lets Encrypt 证书有效期 90 天win-acme 默认会在到期前 30 天自动续。如果你服务器前面有 CDN 或者反向代理HTTP 验证可能失败需要改用 DNS 验证这要求你的 DNS 服务商支持 API。5.2 关掉不必要的模块和目录浏览IIS 装完后默认开了一些用不到的功能比如目录浏览、WebDAV、详细错误。这些在生产环境是风险点。# 关闭目录浏览 Set-WebConfigurationProperty -PSPath IIS:\Sites\demo -Filter system.webServer/directoryBrowse -Name enabled -Value False # 关闭详细错误避免泄露堆栈 Set-WebConfigurationProperty -PSPath IIS:\Sites\demo -Filter system.webServer/httpErrors -Name errorMode -Value DetailedLocalOnly逻辑说明directoryBrowse关掉后访问没有默认文档的目录会返回 403 而不是列出文件。errorMode设成DetailedLocalOnly表示本地访问看详细错误远程访问只看简短错误避免把服务器路径和堆栈暴露给外网。5.3 用请求筛选挡住可疑 URLIIS 的请求筛选Request Filtering可以挡掉一些常见扫描路径比如.git、.env、web.config的远程访问。# 隐藏 web.config禁止远程访问 Set-WebConfigurationProperty -PSPath IIS:\Sites\demo -Filter system.webServer/security/requestFiltering/hiddenSegments -Name . -Value {segmentweb.config} # 拒绝包含 .. 的路径 Add-WebConfigurationProperty -PSPath IIS:\Sites\demo -Filter system.webServer/security/requestFiltering/denyUrlSequences -Name . -Value {sequence..}逻辑说明hiddenSegments里的段会被 IIS 直接拒绝web.config放进去后外网访问http://域名/web.config会返回 404。denyUrlSequences挡掉路径穿越尝试。这些规则不重但能过滤掉一批自动化扫描。6. 进阶把 IIS 日志变成可查的排错依据6.1 用 LogParser 或 PowerShell 快速定位 500 错误IIS 日志是排错的黑匣子但默认格式是空格分隔的文本直接看很痛苦。常见做法是用 LogParser 或者 PowerShell 的Import-Csv来查。下面这段 PowerShell 从 IIS 日志里筛出所有 500 状态码的请求按 URL 分组统计。# 读取最近一天的 IIS 日志筛出 500 错误 $logPath D:\logs\iis\W3SVC1 $logFile Get-ChildItem -Path $logPath -Filter *.log | Sort-Object LastWriteTime -Descending | Select-Object -First 1 # IIS 日志是空格分隔用 -Delimiter 导入 $logs Import-Csv -Path $logFile.FullName -Delimiter -Header date,time,s-ip,cs-method,cs-uri-stem,cs-uri-query,s-port,cs-username,c-ip,cs-User-Agent,cs-Referer,sc-status,sc-substatus,sc-win32-status,time-taken # 筛出 sc-status 为 500 的记录按 URL 分组 $logs | Where-Object { $_.sc-status -eq 500 } | Group-Object cs-uri-stem | Sort-Object Count -Descending | Select-Object Count, Name -First 20逻辑说明IIS 日志默认字段顺序是固定的-Header手动指定列名方便后面按列名筛选。sc-status是 HTTP 状态码sc-substatus是子状态码500 错误看子状态码能快速定位是配置问题还是代码问题。time-taken是请求耗时单位毫秒如果某个 URL 的 500 错误伴随高耗时可能是超时导致的。参数怎么改$logPath换成你实际的日志目录。如果日志按天分文件夹Get-ChildItem要加-Recurse。-First 20控制输出条数排错时先看 Top 20 就够。6.2 用性能计数器看应用程序池的真实压力IIS 管理器里的“工作进程”能看到当前请求数但要看历史趋势和内存回收情况性能计数器更准。Windows Server 2022 自带perfmon可以加ASP.NET Applications和APP_POOL_WAS这两组计数器。常见做法是加这几个APP_POOL_WAS\Current Application Pool Uptime看应用程序池运行了多久如果频繁归零说明在反复回收ASP.NET Applications\Requests/Sec看每秒请求数Process\Private Bytes看w3wp.exe的内存占用。如果 Private Bytes 持续上涨不降大概率是代码里有内存泄漏不是 IIS 的问题。提示性能计数器采样间隔别设太短15 秒一次足够。采样太密本身会消耗资源排错时反而干扰判断。6.3 一个我自己的习惯改完 IIS 配置先导出备份IIS 配置存在applicationHost.config里改错了可能导致整个 IIS 起不来。我自己的习惯是每次大改之前先导出配置出问题直接还原。# 导出 IIS 配置 $backupName iis-backup- (Get-Date -Format yyyyMMdd-HHmmss) Backup-WebConfiguration -Name $backupName # 出问题时还原 # Restore-WebConfiguration -Name iis-backup-20250101-120000逻辑说明Backup-WebConfiguration把当前 IIS 配置打包存到%windir%\system32\inetsrv\backup下面。还原时用Restore-WebConfiguration指定备份名。这个操作不备份站点文件只备份配置所以站点内容还是要单独做文件级备份。这个习惯帮我省过好几次后悔药有一次改请求筛选规则把web.config整个锁死站点直接 500还原配置后两分钟恢复。IIS 的配置改动不像代码可以回滚提前备份是最便宜的保险。希望帮到你。本文还有配套的精品资源点击获取