Windows Server 2019 IIS部署全攻略:从安装到WebSocket配置
2026/8/7 3:01:52 网站建设 项目流程

1. 项目概述:为什么要在Windows Server 2019上部署IIS?

如果你手头有一台运行Windows Server 2019的服务器,无论是物理机还是虚拟机,想要用它来托管一个网站、一个Web API接口,或者搭建一个内部的文件共享门户,那么开启IIS(Internet Information Services)服务几乎是你绕不开的第一步。IIS是微软集成在Windows Server中的Web服务器,它不像Apache或Nginx那样需要单独下载安装包,而是作为一项系统功能,可以随时按需启用。对于很多从开发转向运维,或者需要快速搭建内部测试环境的朋友来说,在Server 2019上配置IIS是一个既基础又关键的技能点。

这个操作本身不复杂,但背后的细节和配置选项却大有学问。直接通过服务器管理器勾选安装,只是万里长征的第一步。安装完成后,你会面临端口绑定、应用程序池管理、身份验证配置、静态文件处理、乃至与.NET Core或PHP等运行时环境的集成等一系列问题。更不用说,在生产环境中,我们还需要考虑性能调优、安全加固和故障排查。网络上搜索“iis error during websocket handshake: unexpected response code: 200”或“iis配置wss”这类问题,恰恰说明了从“安装上”到“用得好”之间存在着巨大的实践鸿沟。本文将从一个有多年一线部署经验的视角,带你完整走一遍在Windows Server 2019上启用和基础配置IIS的流程,并深入那些官方文档可能一笔带过,但实际工作中必然会遇到的“坑”和技巧。

2. 核心需求解析与前期准备

在动手之前,我们得先想清楚几个问题:这台服务器准备用来做什么?这决定了我们安装IIS时需要选择哪些功能模块。盲目全选不仅会增大系统攻击面,还可能引入不必要的性能开销和兼容性问题。

2.1 明确应用场景与功能选型

根据常见的网络热词和搜索趋势,我们可以把需求归纳为几类:

  1. 托管传统ASP.NET应用:这是IIS的“老本行”。如果你的应用基于.NET Framework 4.x及更早版本开发(常见于一些遗留系统),那么IIS是唯一官方的托管选择。你需要确保安装对应的.NET版本和ASP.NET功能。
  2. 托管.NET Core / .NET 5+ 应用:现代.NET应用已经可以跨平台运行,在IIS上通常作为反向代理的后端(通过IIS的ANCM模块)。安装时需要注意“应用程序开发”功能下的“.NET Core”相关选项。
  3. 托管PHP、Python或Node.js应用:IIS可以通过FastCGI模块来运行这些非微软系的语言。例如,配置PHP需要手动安装并配置FastCGI设置,这比在Linux上配置要繁琐一些,但在纯Windows环境中是必要的。
  4. 搭建静态文件服务器或WebDAV:用于内部文件分享。这需要“常见HTTP功能”和“WebDAV发布”功能。
  5. 配置WebSocket服务:用于实时通信应用。正如热词中提到的“iis websocket”和“wss”配置,这需要确保安装了WebSocket协议支持模块,并在应用程序池和站点配置中进行正确设置。
  6. 作为反向代理或负载均衡器:这通常需要安装额外的扩展,如“应用程序请求路由(ARR)”,热词中提到的“iis arr 3.0 完整离线安装包”正是用于此场景。

对于本次演示,我们将以一个最常见的场景为例:搭建一个支持ASP.NET和静态页面的基础Web服务器,并兼顾后续可能扩展的WebSocket需求。这覆盖了大多数内部管理后台、信息展示网站的需求。

2.2 系统与环境检查清单

开始安装前,请完成以下检查:

  • 系统权限:确保你用于登录和操作的账户具有本地管理员权限。这是通过服务器管理器添加角色的必要条件。
  • 网络连接:服务器最好能连接互联网,以便从Windows Update获取必要的更新文件。如果处于隔离的内网,你需要提前准备好Windows Server 2019的安装镜像作为备用源。
  • 防火墙策略:提前规划好端口。IIS默认使用HTTP的80端口和HTTPS的443端口。你需要在Windows防火墙或外围硬件防火墙上开放这些端口,否则安装完成后可能无法从外部访问。

    注意:在生产环境中,强烈建议仅开放必要的端口(如443),并为80端口设置HTTP到HTTPS的重定向,以提高安全性。

  • 磁盘空间:安装IIS核心功能及其常用模块,大约需要额外的几百MB磁盘空间,请确保系统盘有足够余量。

3. 分步详解:通过服务器管理器安装IIS

Windows Server 2019提供了图形化(服务器管理器)和命令行(PowerShell)两种安装方式。对于新手或不熟悉命令的用户,图形化界面更直观。我们首先介绍这种方法。

3.1 启动服务器管理器与添加角色

  1. 登录到Windows Server 2019桌面。通常,服务器管理器会在登录后自动启动。如果没有,你可以在开始菜单中找到它。
  2. 在服务器管理器的左侧窗格中,点击“仪表板”
  3. 在右侧的“快速启动”或“欢迎”区域,点击“添加角色和功能”。这将启动一个向导。
  4. 在“开始之前”页面,直接点击“下一步”
  5. 在“安装类型”页面,选择“基于角色或基于功能的安装”,然后点击“下一步”。
  6. “服务器选择”:确保从服务器池中选中了你当前操作的这台服务器(默认已选中),点击“下一步”。
  7. 关键步骤:选择服务器角色。这是功能选型的核心界面。
    • 在角色列表中,找到并勾选“Web 服务器(IIS)”
    • 勾选后,会弹出一个对话框,提示“是否添加Web服务器(IIS)所需的功能?”,点击“添加功能”。这个步骤会自动把一些基础依赖(如.NET Framework 4.7+的一些功能)一并选中。
    • 此时,你的界面应该类似下图(示意图,以实际为准):

      实操心得:不要急着点“下一步”。先点击角色列表下方的“包括管理工具(如果适用)”复选框。这会确保安装完成后,你可以在服务器管理器或开始菜单中找到“IIS管理器”这个图形化管理工具,否则你可能需要手动再去安装管理工具包。

3.2 精挑细选:功能与角色服务配置

  1. 点击“下一步”,进入“功能”选择页面。这里列出的是跨角色的系统级功能。对于我们基础Web服务器,默认已选中的功能通常已足够(如.NET Framework 4.7、组策略管理等)。你可以直接点击“下一步”。
  2. 进入“Web服务器角色(IIS)”页面,这里才是重头戏。点击右下角的“下一步”,会进入“角色服务”子页面。这里列出了IIS所有可安装的模块,我们需要根据之前的需求分析进行勾选。
    • 必须安装的核心项
      • Web 服务器>常见 HTTP 功能:这是基石,必须全选(默认文档、HTTP错误、静态内容、HTTP重定向)。
      • Web 服务器>安全性:至少安装“请求筛选”和“URL授权”。如果网站需要基础认证,可以勾选“基本身份验证”,但Windows身份验证更常见于内网。
      • Web 服务器>应用程序开发:这是根据你的编程语言来选的。
        • 如果托管ASP.NET(.NET Framework),必须勾选“.NET Extensibility 4.7”“ASP.NET 4.7”
        • 如果未来可能托管.NET Core,强烈建议同时勾选“.NET Core”下的“Windows 托管捆绑包”(安装时会识别为另一个名称,如“ASP.NET Core 模块”)。注意,.NET Core运行时本身需要另行下载安装。
        • 如果需要运行经典ASP(老古董应用),勾选“ASP”。
        • 如果需要运行PHP,这里不选,需要后续通过FastCGI手动配置。
      • 管理和工具>IIS 管理控制台:必须勾选,这是我们后续管理IIS的主要图形界面。
      • 管理和工具>IIS 管理脚本和工具:建议勾选,它提供了appcmd.exe等命令行工具,在自动化脚本和批量操作时非常有用。
    • 按需安装的重要项
      • 性能功能>静态内容压缩动态内容压缩:对于带宽有限或对速度要求高的站点,建议勾选。它们可以显著减小传输文件体积。
      • 运行状况和诊断>HTTP日志记录请求监视器:用于排查问题,建议勾选。
      • Web 服务器>应用程序开发>WebSocket 协议:如果你计划启用WebSocket(如用于实时聊天、仪表板),必须勾选此项。这是解决“websocket handshake”错误的第一步。
  3. 选择完毕后,点击“下一步”。
  4. 在“确认”页面,你可以看到所有即将安装的角色、功能和角色服务的列表。这里有一个非常重要的操作:勾选左下角的“如果需要,自动重新启动目标服务器”。因为安装某些.NET Framework更新可能需要重启。如果这是生产服务器,请确保在维护窗口进行操作。
  5. 点击“安装”。安装过程会持续几分钟到十几分钟,取决于你选择的组件数量和服务器性能。等待进度条完成。

3.3 安装后验证与IIS管理器初探

安装完成后,不要关闭向导,直接点击“启动IIS管理器”的链接(如果未显示,可以关闭向导,从开始菜单的“Windows 管理工具”中找到“Internet Information Services (IIS)管理器”并打开)。

  1. 验证服务状态:打开IIS管理器后,在左侧“连接”窗格,你应该能看到你的服务器名称。点击它,中间主窗格会显示“管理”和“区域”两部分。这证明IIS服务已成功安装并运行。
  2. 访问默认站点:打开服务器上的浏览器(如Edge),输入http://localhosthttp://127.0.0.1。你应该能看到一个IIS的欢迎页面,上面有鸟和山峰的图片,并显示“IIS 10”字样。这说明默认网站正在80端口上正常运行。
  3. 检查默认站点绑定:在IIS管理器中,展开服务器节点,再展开“站点”,选中“Default Web Site”。在右侧“操作”窗格点击“绑定...”。你会看到它绑定在了*:80上,意思是监听所有IP地址的80端口。

至此,IIS服务已经成功开启。但这只是一个“裸奔”的默认状态,接下来我们需要进行安全、实用的基础配置。

4. 核心配置详解:从默认站点到可用的Web服务器

安装只是开始,配置才是体现价值的地方。我们将一步步把一个默认站点,配置成一个更安全、更符合实际需求的基础Web服务器。

4.1 创建与配置一个新的应用程序池

不建议直接使用“DefaultAppPool”来承载你的业务应用。为不同应用创建独立的应用程序池,可以实现资源隔离,避免一个应用崩溃影响其他应用,也便于单独管理(如回收、权限设置)。

  1. 在IIS管理器左侧“连接”窗格,点击服务器名下的“应用程序池”
  2. 在右侧“操作”窗格,点击“添加应用程序池...”
  3. 在弹出的对话框中:
    • 名称:输入一个有意义的名称,如MyWebAppPool
    • .NET CLR 版本:如果你的应用是.NET Framework 4.x,选择“.NET CLR版本 v4.0.30319”。如果是.NET Core或纯静态网站,选择“无托管代码”。这是关键选择,选错会导致应用无法启动。
    • 托管管道模式:对于.NET Framework应用,通常选择“集成”模式,它提供了更好的性能和功能集成。经典模式主要用于兼容一些非常老旧的、需要特定ISAPI过滤器的应用。
    • 点击“确定”。
  4. 高级设置(重要):右键点击新建的应用程序池,选择“高级设置...”。有几个关键参数:
    • 启动模式:默认为“OnDemand”(按需)。如果对启动速度有要求,可以改为“AlwaysRunning”(始终运行)。
    • 回收>固定时间间隔(分钟):默认为1740(29小时)。生产环境可以根据内存使用情况或特定时间(如凌晨)设置定期回收,以释放内存和清理状态。也可以设置为“特定时间”回收。
    • 进程模型>标识:默认为“ApplicationPoolIdentity”。这是一个虚拟账户,比直接用“LocalSystem”或“NetworkService”更安全,因为它为每个应用程序池创建了独立的、权限受限的账户。这是微软推荐的安全最佳实践。

4.2 部署你的第一个网站

现在我们来创建一个新的网站,替换掉那个默认的IIS欢迎页。

  1. 在IIS管理器左侧“连接”窗格,右键点击“网站”,选择“添加网站...”
  2. 在弹出的对话框中填写信息:
    • 网站名称:例如MyTestSite
    • 应用程序池:点击右侧“选择...”,选择我们上一步创建的MyWebAppPool。这一步建立了网站与应用池的关联。
    • 物理路径:选择一个本地文件夹来存放你的网站文件(如C:\WebSites\MyTestSite)。请确保该文件夹已存在,并且上一步中应用程序池的标识账户(如IIS AppPool\MyWebAppPool)对该文件夹拥有“读取”和“执行”的NTFS权限。这是最常见的“HTTP 错误 500.19 - Internal Server Error”或“访问被拒绝”错误的根源。

      权限设置实操:在文件夹属性 -> “安全”选项卡 -> “编辑” -> “添加” -> 输入对象名称IIS AppPool\MyWebAppPool-> “检查名称” -> 确定。然后为该账户分配“读取和执行”、“列出文件夹内容”、“读取”权限。对于需要上传文件的目录,可能还需要“写入”权限。

    • 绑定
      • 类型httphttps。我们先从http开始。
      • IP地址:默认“全部未分配”,表示监听服务器上所有IP的指定端口。如果你的服务器有多个IP,可以指定一个。
      • 端口:如果80端口已被默认网站占用,你需要换一个,比如8080。或者,可以先停止“Default Web Site”,然后新网站继续用80端口。
      • 主机名:如果你有域名,并且想通过IIS实现多个网站在同一端口上通过不同域名区分(基于主机头的绑定),可以在这里输入域名(如www.mytest.com)。本地测试可以留空。
    • 点击“确定”。
  3. 在刚才设置的物理路径(C:\WebSites\MyTestSite)下,创建一个最简单的index.html文件,内容如下:
    <!DOCTYPE html> <html> <head><title>我的网站</title></head> <body><h1>Hello from MyTestSite on IIS!</h1></body> </html>
  4. 在浏览器中访问你的网站。如果使用80端口且停止了默认网站,访问http://服务器IP。如果使用了8080端口,访问http://服务器IP:8080。你应该能看到刚才创建的HTML页面。

4.3 关键安全与性能配置

一个可用的网站上线了,但一个安全的网站还需要更多配置。

  1. 删除不必要的默认功能:在IIS管理器中,点击你的服务器名,在主窗格中双击“功能委派”。对于生产环境,可以考虑将一些不用的功能(如“目录浏览”)设置为“只读”或“拒绝”,防止配置被下级继承和修改。
  2. 配置请求筛选:点击你的网站MyTestSite,在主窗格中双击“请求筛选”。这是一个重要的安全功能。
    • 文件扩展名:可以拒绝某些危险扩展名的请求(如.config,.bak,.old)。
    • URL:可以设置拒绝包含某些字符序列(如../用于路径遍历攻击)的请求。
    • HTTP谓词:如果你的网站只使用GET和POST,可以拒绝PUT、DELETE等其他谓词。
  3. 启用静态内容压缩:在服务器级别,双击“压缩”。确保“启用静态内容压缩”被勾选。这可以自动对CSS、JS、图片等静态文件进行Gzip压缩,减少传输大小,提升加载速度。
  4. 配置默认文档:点击你的网站,双击“默认文档”。确保你的网站首页文件名(如index.html,default.aspx)在列表中,并且顺序靠前。你可以通过右侧操作窗格进行添加、删除或排序。
  5. 错误页面定制:双击“错误页”。可以将默认的详细错误信息(会暴露服务器路径等敏感信息)替换为自定义的友好错误页面。对于生产环境,建议为403、404、500等常见错误设置自定义页面。

5. 进阶场景与深度问题排查

基础配置完成后,我们可能会遇到一些更复杂的需求或问题。这里结合网络热词,探讨几个典型场景。

5.1 配置HTTPS与绑定SSL证书

现代网站必须使用HTTPS。这需要SSL证书。

  1. 获取证书:你可以从证书颁发机构(CA)购买,或者使用免费的Let‘s Encrypt证书(在Windows上可通过win-acme等工具自动获取)。对于内部测试,也可以在服务器上创建自签名证书(IIS管理器 -> 服务器证书 -> 创建自签名证书)。
  2. 添加HTTPS绑定:在IIS管理器中,右键你的网站 -> “编辑绑定...” -> “添加”。
    • 类型:https
    • IP地址和端口:端口默认为443。
    • SSL证书:选择你导入或创建好的证书。
    • 点击“确定”。
  3. HTTP重定向到HTTPS:为了强制所有流量使用安全连接,可以添加一个URL重写规则。在网站级别,双击“URL重写”,在右侧“操作”窗格点击“添加规则...”,选择“空白规则”。
    • 名称:Force HTTPS Redirect
    • 模式:(.*)
    • 条件:添加一个条件,输入{HTTPS},模式为^OFF$
    • 操作:操作类型为“重定向”,URL为https://{HTTP_HOST}/{R:1},重定向类型为“永久(301)”。
    • 这样,所有HTTP请求都会被301重定向到对应的HTTPS地址。

5.2 解决WebSocket握手错误

当你在IIS上部署一个使用WebSocket的应用(如ASP.NET Core SignalR,或某些前端实时框架),访问时浏览器控制台可能会报错:iis error during websocket handshake: unexpected response code: 200。这个“200”状态码很迷惑,它表示握手请求被当作普通HTTP请求处理并成功返回了,而不是升级到WebSocket协议。

排查与解决步骤:

  1. 确认模块已安装:首先回到第3.2节,确保在安装IIS时勾选了“WebSocket 协议”。如果没有,需要通过“添加角色和功能”向导进行添加。
  2. 检查应用程序池设置:WebSocket要求应用程序池的“托管管道模式”必须为“集成”模式。经典模式不支持。
  3. 检查站点绑定:WebSocket连接通常也使用HTTP(80)或HTTPS(443)端口发起,但协议升级发生在握手阶段。确保你的站点正确绑定了这些端口。
  4. 检查URL重写或ARR代理配置:如果你在IIS前使用了ARR(应用程序请求路由)做反向代理,或者配置了某些URL重写规则,可能会干扰WebSocket的升级握手。需要确保代理或重写规则能正确传递WebSocket所需的HTTP头(Upgrade,Connection,Sec-WebSocket-Key等)。ARR 3.0及以上版本对WebSocket有原生支持,但需要正确配置。
  5. 检查应用程序代码:确保后端应用(如ASP.NET Core)正确配置了WebSocket中间件。对于ASP.NET Core应用,在Startup.csConfigure方法中,UseWebSockets中间件需要在UseEndpoints之前调用。
  6. 使用浏览器开发者工具:在浏览器的网络(Network)标签页中,找到WebSocket连接(类型为wswss),查看握手请求和响应头。正常的响应状态码应该是“101 Switching Protocols”,而不是200。如果看到200,说明请求没有成功升级。

5.3 托管.NET Core应用的特殊配置

托管.NET Core应用与托管传统ASP.NET应用有显著不同。IIS在这里主要扮演反向代理的角色。

  1. 安装托管捆绑包:确保服务器上安装了对应版本的“.NET Core Hosting Bundle”。这个安装包包含了.NET Core运行时、ASP.NET Core模块(ANCM)等必要组件。安装时IIS必须停止,安装程序会自动重启IIS。
  2. 应用程序池配置:为.NET Core应用创建的应用程序池,其“.NET CLR 版本”必须设置为“无托管代码”。因为.NET Core是自托管的,不依赖IIS的CLR。
  3. 发布与部署:将你的.NET Core应用通过dotnet publish命令发布为“框架依赖”或“独立”部署包。将发布后的文件(包含web.config,appsettings.json,YourApp.dll等)复制到IIS网站的物理路径。
  4. 检查web.config:发布生成的web.config文件至关重要,它里面的<aspNetCore>节配置了ANCM模块如何启动你的后端进程。确保processPath指向了正确的dotnet可执行文件或你的应用exe,arguments指向了主DLL。
  5. 常见错误:如果遇到“502.5 - Process Failure”错误,通常是ANCM无法启动后端进程。检查事件查看器(Windows Logs -> Application)中的详细错误信息,通常是运行时未安装、路径错误或权限问题。

6. 日常维护、监控与故障排查工具箱

将网站部署上线后,日常的维护和问题排查能力同样重要。

6.1 必备的监控与日志查看点

  • IIS日志:默认路径在C:\inetpub\logs\LogFiles下,按站点和日期分文件夹。这里记录了所有HTTP请求,是分析访问情况、排查错误请求的第一手资料。你可以配置日志的字段、滚动规则等。
  • Windows事件查看器:路径为“应用程序和服务日志” -> “Microsoft” -> “Windows” -> “Application-Experience” 和 “IIS-Configuration”。这里记录了IIS服务启动、关闭、配置更改以及应用程序池崩溃等系统级事件。
  • 失败请求跟踪:IIS的一个强大功能。你可以为特定状态码(如500)、或耗时过长的请求启用跟踪,它会生成详细的XML报告,记录请求在IIS各个处理阶段的耗时和状态,是定位性能瓶颈和复杂错误的利器。

6.2 常见问题速查与解决思路

问题现象可能原因排查步骤
HTTP 403.14 - Forbidden目录浏览被禁用,且没有配置默认文档。1. 检查站点物理路径下是否存在默认文档(如index.html)。
2. 在IIS中检查该站点的“默认文档”设置是否正确。
3. (非必要不开启)检查“目录浏览”是否被意外启用(通常应禁用)。
HTTP 500.19 - Internal Server Error配置文件错误或权限不足。错误代码会提供具体信息。1. 查看错误页面上的“配置错误”描述,通常指向web.config的某一行。
2. 检查应用程序池标识对网站物理路径是否有读取权限。
3. 检查是否安装了所需的IIS功能模块(如ASP.NET)。
HTTP 502.3 - Bad Gateway后端进程启动失败或连接超时(常见于.NET Core)。1. 检查事件查看器中的应用日志。
2. 检查web.config中的<aspNetCore>配置。
3. 检查是否安装了正确版本的.NET Core运行时或Hosting Bundle。
4. 尝试在命令行手动切换到应用目录,执行dotnet YourApp.dll看是否能启动。
网站响应缓慢服务器资源不足、数据库慢、应用代码性能问题、或IIS配置不当。1. 使用任务管理器或资源监视器查看CPU、内存、磁盘IO。
2. 启用“失败请求跟踪”对慢请求进行分析。
3. 检查应用程序池是否频繁回收(查看IIS日志中的“回收”事件)。
4. 检查是否启用了动态内容压缩。
静态文件(如图片、CSS)无法访问MIME类型未配置或请求筛选阻止。1. 在服务器级别或站点级别,检查“MIME类型”设置,确保有对应扩展名的类型(如.woff2对应font/woff2)。
2. 检查“请求筛选”,看是否屏蔽了该文件扩展名。

6.3 性能调优小贴士

  • 应用程序池回收策略:对于内存泄漏不明显的稳定应用,可以适当延长回收间隔,或改为在特定低峰时间回收,避免回收导致的短暂服务中断。
  • 输出缓存:对于不常变化的动态页面,可以考虑使用IIS的“输出缓存”功能,将整个页面缓存起来,极大减轻后端压力。
  • 动态压缩与静态压缩:确保都已启用。对于API返回的JSON/XML数据,动态压缩效果显著。
  • 连接限制:在“站点” -> “限制”中,可以设置最大并发连接数和带宽限制,防止某个站点耗尽服务器资源。

从点击“添加角色和功能”到构建出一个稳定、安全、可维护的Web服务器,每一步的选择和配置都影响着最终服务的质量。IIS看似图形化简单,但其内部模块众多,配置项繁杂,真正的熟练来自于对每个功能背后原理的理解和大量实践中的排错。建议在测试环境中多尝试不同的配置组合,并养成查看日志和分析事件的习惯,这样当生产环境出现问题时,你才能快速定位到那个关键的配置节点或缺失的模块。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询