☰
Node.js部署到IIS全攻略:从安装、配置到排错实战
2026/10/2 14:54:35 网站建设 项目流程

把 Node.js 部署到 IIS 这件事,很多人一听第一反应是没必要:本地一条node app.js就能跑,为什么要折腾 IIS?但如果你在公司内网维护过 Windows 服务器,就会知道情况完全不是这样。团队要求统一走 IIS 管理端口、绑定域名、挂证书,运维体系里没有单独的 Node 进程管理工具,这时候把 Node 应用“塞进”IIS 就成了刚需。我当年第一次做这个事,把网上教程翻了几十篇,结果卡在 IIS 模块版本、应用池权限和 web.config 这些细节上好几天,很多教程都是“装完 iisnode 就能跑”,实际操作全是坑。这篇我按自己跑通整套流程的顺序,把 Node.js 的安装环境、IIS 的开启方式、托管模块的选择、web.config 的配置、应用池和站点绑定全部拆开讲,最后再把高频报错一次性列清楚。适合刚接触 Windows 服务器、正准备把第一个 Node 项目部署上去的同学,也适合想从老方案迁移的人。

1. 部署前的思路:为什么要把 Node.js 放到 IIS 上

1.1 命令行直接跑不香吗?谈谈 IIS 托管的真实价值

如果只是本地开发,命令行直接跑完全没问题。可一旦放到服务器上,裸命令行跑 Node 会遇到一连串问题:窗口一关进程就没了,机器重启后没人帮你把它拉起来;进程崩溃之后也不会自动恢复;端口被谁占用得自己排查;管理多个 Node 服务时更是混乱。这些都是运维层面的现实问题,不是你代码写得好就能绕开的。

IIS 在这里的价值是“托管”而不是“运行”。你可以把 IIS 理解成一个酒店前台,Node 应用是住客,客人不需要自己去大街上找吃的,前台会负责安排房间、送水、处理投诉。用 IIS 托管 Node 之后,Node 进程由 IIS 的工作进程管理服务统一拉起,崩溃了会自动重启,开机也能自动恢复;HTTP 请求由 IIS 统一接收,再转交给 Node 处理;日志走 IIS 的规范格式,域名和 HTTPS 证书也在同一个地方管理。这套集成能力,才是你花时间折腾部署的真正原因。

所谓“把 Node.js 部署到 IIS”,本质上是让 IIS 成为 Node 进程的前置宿主。它不改变你写 Node 的方式,只是在外面包了一层进程管理和请求转发。理解这一点,后面所有配置就都顺了。

1.2 三条技术路线怎么选:iisnode、httpPlatformHandler、反向代理

部署方式网上说法很杂,稍不注意就被带偏。我按自己的实践经验归纳成三条路线。

方案核心原理优点缺点适用场景
iisnode在 IIS 里注册一个 ISAPI 处理程序,请求通过命名管道交给 Node和 IIS 集成最细,能控制 Node 进程数量和回收策略维护频率不高,和新版 Node 的兼容性有时有坑老项目已在用 iisnode,不想大改
httpPlatformHandler微软官方托管模块,由 IIS 拉起 node.exe 进程并转发请求官方持续维护,支持新 Node 版本,崩溃自动拉起,配置简单多进程扩展需要自己另想方案,稳定成型的教程相对少新项目首选
IIS 反向代理Node 自己监听一个端口,IIS 用 URL Rewrite 转发代码层面改动最小,Node 生态原样保留,排障最直观需要额外用 PM2 或 NSSM 守护 Node 进程团队已经习惯 PM2 管理 Node 服务

我的建议很直接:如果是新项目,优先选httpPlatformHandler。它是微软现在官方主推的托管方式,既能满足“让 IIS 统一管理进程”的核心诉求,又不像 iisnode 那样动不动就版本不对位。文章主线就按这个方案走,最后一章再补反向代理路线的选型和配置。

1.3 需要的物料清单

动手前先把东西备齐,免得装到一半卡住。

  • 一台 Windows 服务器或本机:Windows Server 2016/2019/2022,Win10/11 也能做本地模拟。
  • Node.js LTS 安装包(.msi 或 zip 绿色版都行)。
  • IIS 功能:系统自带,Web 服务器角色。
  • httpPlatformHandler 1.2 x64 安装包,微软官网下载。
  • URL Rewrite 模块:后面 HTTPS 跳转和反向代理方案要用。
  • 一个 Express 应用(手写最小示例即可)。
  • 一个具有管理员权限的账号。
  • 可选:7-Zip 或任一解压工具,处理绿色版 Node 时用得上。

有了这张清单,后面就不会频繁停下来找东西。

2. 环境安装:从零准备一台能跑 Node 的 IIS 服务器

2.1 安装 Node.js:版本选择、PATH、以及两个高频报错

下载 Node.js 时,认准官网nodejs.org首页的LTS 版本,不要图新鲜用 Current 版。LTS 稳定性和生态兼容性都有保障,服务器上跑应用不是追新的时候。

安装包默认路径是C:\Program Files\nodejs\,我习惯手动改成纯英文且无空格的目录,比如D:\Nodejs或C:\nodejs。为什么?有些原生模块和脚本解析路径时对空格敏感,在 IIS 托管环境下更容易出幺蛾子,干脆从源头避开。装的时候留意勾选“Add to PATH”,这样命令行才能直接识别node和npm。

装完以后,新开一个 PowerShell 窗口验证:

node -v npm -v

这里强调“新开窗口”,是因为 PATH 环境变量修改只对新进程生效,旧窗口里敲命令仍然会提示找不到。

绿色版是另一种思路:有些公司电脑不让装全局软件,只能解压。把 zip 包解压到D:\nodejs,然后手动把D:\nodejs加到系统 PATH 环境变量里,效果和 msi 安装一样。热搜里那个“nodejs 免安装环境配置”指的就是这个。

这一节单独讲两个高频报错,因为实在太常见了:

第一个:安装时报错 2203。错误编号 2203 通常和 Windows Installer 临时目录权限有关,杀毒软件或安全策略经常横插一脚。处理顺序:以管理员身份重新运行安装包;清理C:\Windows\Temp和%TEMP%目录;重启 Windows Installer 服务;再不行就改用 zip 绿色版,反而干净利落。

第二个:npm 命令通不过,提示类似“无法加载文件 ... npm.ps1,因为在此系统上禁止运行脚本”。这是 PowerShell 执行策略默认不允许运行.ps1脚本导致的,不是 npm 坏了。两个解法:要么直接用 CMD 窗口跑npm -v,绕开 PowerShell 的限制;要么在当前用户下放开脚本执行权限:

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

输入Y确认即可。这个报错在热搜里出现的频率非常高,属于“老手遇不到,新手遇到两眼一抹黑”的典型问题。

2.2 启用 IIS:图形界面和 PowerShell 两种方式

Windows 服务器上启用 IIS,最标准的路子是“服务器管理器 → 添加角色和功能”,一路下一步,勾选Web 服务器(IIS)。注意别只勾最外层,建议把“常见 HTTP 功能”里的静态内容、默认文档、HTTP 错误,以及“应用程序开发功能”下的 ISAPI 扩展、ISAPI 筛选器、CGI 都勾上。这些功能现在看着多余,以后装模块、排错时少很多麻烦。

Win10/11 作为本地开发机的话,去“控制面板 → 程序 → 启用或关闭 Windows 功能”,勾选“Internet Information Services”,同样建议把“应用程序开发功能”和“Web 管理工具”下的子项勾上。

热搜里那个“server2019 iis 添加进度不动”的问题,我在 Server 2019 上遇到过不止一次。图形界面卡在进度条时,直接开一个管理员 PowerShell 跑命令:

Install-WindowsFeature -Name Web-Server -IncludeManagementTools

这条命令会把 IIS 核心角色和管理工具一起装好,比图形界面稳。Windows 客户端系统可以用 DISM 命令:

dism /online /enable-feature /featurename:IIS-WebServerRole /featurename:IIS-ManagementConsole

装完以后,浏览器访问http://localhost,看到 IIS 默认欢迎页就说明基础环境通了。

2.3 安装 httpPlatformHandler 托管模块

去微软官网搜“HttpPlatformHandler v1.2”,下载 x64 版本。安装前确认 IIS 已经装好,否则安装器会直接报错退出。

安装完成后,打开 IIS 管理器,找到站点级别的“处理程序映射”,应该能看到名为httpPlatformHandler的条目。如果看不到,先在管理员命令行执行iisreset /restart,重启 IIS 再刷新。这一步容易漏,很多教程没提,导致后面 web.config 里写了 handler 却始终不生效。

顺手把 URL Rewrite 模块也装上。它虽然在主线方案里不是必需,但后面做 HTTPS 跳转、反向代理时基本都会用到,提前装好省得来回折腾。

3. 项目落地:让 IIS 真正把 Node 应用托管起来

3.1 准备一个最小可跑的 Express 应用

先在服务器上建一个项目目录,我习惯放在C:\inetpub\wwwroot\nodeapp,这个路径后续会作为 IIS 站点的物理路径。

在目录里初始化项目:

npm init -y npm install express

然后新建app.js,内容如下:

const express = require('express'); const os = require('os'); const app = express(); const PORT = process.env.PORT || 3000; app.get('/', (req, res) => { res.send(`Hello from Node.js on IIS! Host: ${os.hostname()}`); }); app.listen(PORT, () => { console.log(`Node app listening on port ${PORT}`); });

这里最关键的一行是const PORT = process.env.PORT || 3000。在 IIS 托管环境里,端口号通常由宿主进程通过环境变量注入,代码里读到什么就监听什么;写死 3000 反而可能出现端口冲突或请求无法到达。加上|| 3000是为了命令行直接跑时也能自测。

写完后,先不要碰 IIS,直接在项目目录执行node app.js,浏览器访问http://localhost:3000。能正常显示页面,说明应用本身没问题。这一步相当于把“代码问题”和“IIS 配置问题”预先切分开了,后面排障时思路会非常清晰。

3.2 web.config 逐行拆解:httpPlatformHandler 参数详解

接下来在项目根目录新建web.config。这个文件是 IIS 的站点级配置入口,整个站点要不要被 Node 接管、怎么接管,都靠它说了算。

<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <handlers> <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" /> </handlers> <httpPlatform processPath="C:\nodejs\node.exe" arguments="app.js" stdoutLogEnabled="true" stdoutLogFile="C:\logs\node.log" startupTimeLimit="20" requestTimeout="00:02:00"> <environmentVariables> <environmentVariable name="NODE_ENV" value="production" /> </environmentVariables> </httpPlatform> </system.webServer> </configuration>

逐个说:

  • handlers节点:把进入站点的 HTTP 请求交给httpPlatformHandler处理。path="*"表示不管哪个路径都交给它,verb="*"表示 GET、POST 等所有请求方法都包含。
  • processPath:指向node.exe的绝对路径。我强烈建议和前面一样,安装在无空格的纯英文路径,能避开一堆莫名其妙的坑。
  • arguments:Node 进程启动参数,入口文件是app.js。
  • stdoutLogEnabled和stdoutLogFile:把 Node 进程打印到控制台的信息写进日志文件。你代码里的console.log、报错堆栈都会出现在这里,排查问题第一站就是它。日志目录需要提前建好,且要有写权限。
  • startupTimeLimit:IIS 启动 Node 进程后,等待它就绪的最长时间,单位秒。默认 20,机器性能差或依赖加载慢就调大到 60。
  • requestTimeout:单个请求的最大处理时间。如果应用里有大数据导出、批量计算这类长耗时接口,默认配置可能不够,按需加大。
  • environmentVariables:通过环境变量注入配置。这里设置的NODE_ENV=production,在代码里通过process.env.NODE_ENV就能读到。

改完保存后,IIS 会自动检测到 web.config 变化并重新加载,不需要手动重启。但如果改了多遍始终没生效,回收一次应用池是最快的复位方式。

3.3 目录权限与日志目录设置

web.config 配好只是第一步,权限没给对,照样访问不了。

在C:\inetpub\wwwroot\nodeapp目录上右键 → 属性 → 安全,添加两个账号:IUSR和IIS_IUSRS,勾选“读取和执行”。这两个是 IIS 默认的工作进程身份,给它们读取权限,IIS 才能读到你项目里的文件、把请求转给 Node 进程。

日志目录同样要处理。比如按照上面配置里的C:\logs\node,就要给IIS_IUSRS加上“修改”或“写入”权限,否则 Node 进程往日志文件里写内容时会被系统拒绝,而表现很可能只是页面无响应,不会直接报“权限不足”给你看。

最后讲一个安全习惯:如果 Node 应用需要写文件,比如上传目录或者运行日志,单独给对应的子目录加“修改”权限就行,不要整个站点根目录开写权限。真被攻破时,写权限范围越小,损失越小。

3.4 老项目兼容:iisnode 传统配置写法

如果你的老项目已经在用 iisnode,切到 httpPlatformHandler 之前,先看懂老配置长什么样:

<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <handlers> <add name="iisnode" path="app.js" verb="*" modules="iisnode" /> </handlers> <iisnode nodeProcessCommandLine="C:\nodejs\node.exe" /> </system.webServer> </configuration>

iisnode 的机制是直接把app.js映射成处理程序入口,Node 代码里同样需要监听process.env.PORT,只不过这个 PORT 来自 iisnode 创建的命名管道。这套方案最大的问题是维护频率低,遇到新版 Node 或某些原生模块时容易报 500。我的建议很简单:不是已经在生产环境跑着的老项目,就别主动选它;遇到坑也不要死磕,把 web.config 换成 3.2 节的写法,代码基本不用改。

4. 应用池、站点绑定与上线:让应用可以被外网访问

4.1 为 Node 应用创建专用应用池

走到这一步,IIS 已经能把 Node 进程拉起来了,接着要给它安排一个独立的应用池,避免和服务器上其他站点互相干扰。

在 IIS 管理器左侧点击“应用程序池”,右侧“添加应用程序池”:

  • 名称:NodeAppPool,名字随意。
  • .NET CLR 版本:选“无托管代码”。
  • 托管管道模式:集成。

选“无托管代码”这个点,我要单独解释一下。Node 进程本身不跑在 .NET 运行时上,选了托管版本反而会给进程额外加载 CLR,既没必要又浪费内存。热搜里“iis 中没有。net8”这类问题,多半也是被“应用程序池必须要选一个 .NET 版本”这个惯性思维带偏了,Node 项目根本不需要。

添加之后还要改几个高级设置:

  • 进程模型 → 标识:保持默认的ApplicationPoolIdentity即可;如果项目特殊需求要指定账号,再单独改。
  • 进程模型 → 闲置超时(分钟):改为0。默认 20 分钟,超过这个时间没有请求,IIS 会回收 Node 进程,下次访问会经历冷启动,特别慢。应用里有内存缓存或 WebSocket 连接的话,被回收更是灾难。
  • 回收 → 固定时间间隔:改为0。默认 1740 分钟(29 小时)会定时回收一次,同样会中断 Node 进程。后台任务、定时器这类逻辑最怕这种“悄悄的重启”。
  • 启动模式:改为“始终运行”。IIS 8.5 以上支持,配合预热让进程常驻,避免第一个请求卡半天。

这些设置弄完后,It’s time to move to the site.

4.2 添加站点、绑定域名与端口

IIS 管理器左侧“网站”上右键 → “添加网站”:

  • 站点名称:NodeApp。
  • 应用程序池:选择刚建好的NodeAppPool。
  • 物理路径:C:\inetpub\wwwroot\nodeapp。

默认绑定是“全部未分配”IP、端口 80、主机名不填。如果服务器上已经有站点占用了 80 端口,会提示冲突,先停掉默认站点或换一个端口。

只让本机访问的话,IP 地址绑定为127.0.0.1就够了。想让内网或公网访问,必须绑定“全部未分配”或具体的内网/公网 IP,同时确认 Windows 防火墙入站规则放行了对应端口。云服务器还要到云控制台的安全组里放行端口。这一步单独拿出来讲,是因为我把“服务器 IIS 网站外网打不开”这类问题排查到最后,十次有八次都是防火墙或安全组在挡路,而不是 IIS 本身的问题。

有域名的场景更简单:站点“绑定”里添加一个node.example.com主机名,再到 DNS 那边解析到服务器 IP。同一个 IP 加多个站点、每个站点不同主机名,IIS 会按主机名路由请求,这也是很多人选择 IIS 管理多站点的原因。

配置完成后,浏览器访问绑定地址,能看到Hello from Node.js on IIS!就说明整个链路通了。如果打不开,直接跳到第 5 章对照排查。

4.3 HTTPS 证书绑定与 HTTP 跳转

IIS 之所以在 Windows 生态里经久不衰,HTTPS 配置相对简单是很重要的原因。

打开 IIS 管理器 → 服务器根节点 → “服务器证书”,右侧选择“导入”,选中你的.pfx证书文件,输入私钥密码。管理型证书颁发机构给的一般是 pfx;如果是 pem/crt/key 那一套,可以先用 OpenSSL 转成 pfx 再导入。

导入成功后,到站点“绑定”里添加:

  • 类型:https
  • IP 地址:全部未分配
  • 端口:443
  • 主机名:如果不填,这个证书会匹配该 IP 上所有 https 请求
  • SSL 证书:选择刚导入的证书

HTTP 自动跳 HTTPS 也顺手做了。安装 URL Rewrite 模块后,在web.config的<system.webServer>节点内加规则:

<rewrite> <rules> <rule name="HTTPS Redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite>

这段规则的意思是:只要当前请求是 HTTP,就永久重定向到 HTTPS 的相同地址。内网环境用自签证书测试没问题,但生产环境不要用自签,证书信任问题会伴随你整个部署周期。导入证书时报“指定的网络密码不正确”,九成是私钥密码复制错了,要么是 pfx 导出时用的加密算法和当前服务器版本不兼容。

4.4 静态文件与 Node 路由共存问题

httpPlatformHandler 配置里我写了path="*",也就是所有请求都交给 Node。这样做对纯 Node 应用最省心,express.static('public')能处理静态文件。但如果你希望.css、.js、图片这些静态资源由 IIS 原生能力处理,别让 Node 承担这部分压力,就需要调整 handler 规则。

在<handlers>里把规则拆开:

<handlers> <add name="StaticFile" path="*.js;*.css;*.png;*.jpg;*.gif;*.ico;*.svg;*.woff;*.woff2" verb="*" modules="StaticFileModule" resourceType="File" /> <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" /> </handlers>

IIS 会按处理程序列表的顺序逐个尝试匹配。把静态文件规则放在前面,命中后缀的请求直接由 IIS 返回文件;没命中的再往下走,交给 httpPlatformHandler 转发给 Node。顺序反了会导致静态文件也被 Node 接管,然后再到 Node 里找对应文件,演变成 404 或性能问题。

实际项目里,静态资源少就直接让express.static处理,配置最简单;静态资源多、并发大,再拆到 IIS 层。

5. 高频报错排查:把这些坑提前替你踩完

5.1 高频报错速查表

我把经过实战检验的问题整理成表,覆盖了热搜和日常部署里出现频率最高的几类。

场景 / 报错可能原因解决办法
npm.ps1无法加载,提示禁止运行脚本PowerShell 执行策略限制用 CMD 跑 npm,或执行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
安装 Node.js 报 2203 错误Windows Installer 临时目录权限异常,或被杀毒拦截管理员身份运行;清理 Temp;关杀毒;或改用 zip 绿色版
IIS 报“执行此操作时出错,文件名 inetsrv\config...”配置文件被占用、只读或权限不足管理员身份重试;确认文件未只读;临时停 W3SVC 服务;检查杀毒
Server 2019 IIS 添加进度不动图形界面等待角色服务超时改用Install-WindowsFeature -Name Web-Server -IncludeManagementTools
创建站点的应用池下拉框找不到 .NET 8被“选择 CLR 版本”的惯性思维带偏Node 项目选“无托管代码”,不依赖 .NET 运行时
设置应用池标识报 0x80005000图形界面写配置失败,常因权限或组策略限制管理员身份重跑;或直接用 appcmd 命令修改标识
站点返回 500 或 500.1000Node 进程没起来或 web.config 错误先命令行node app.js自测;再看 stdout 日志;确认 node.exe 路径正确
站点返回 502.3请求超时或 Node 进程崩溃调大requestTimeout;看事件查看器;确认日志目录可写
修改代码后不生效httpPlatformHandler 托管的 Node 进程常驻回收对应应用池,或执行iisreset /restart
外网打不开,本机能开防火墙、云安全组、或绑定地址错误放行入站端口;检查安全组;确认绑定的是“全部未分配”
打开目录显示文件列表或 403默认文档配置,或请求没被 Node 接管确认应用有/路由;检查 web.config handler
iisnode 方案下静态文件 404通配符映射把所有请求都转给了 Node切 httpPlatformHandler;或按后缀拆分 handler

关于 0x80005000 这个报错,我再补充一个实用命令。图形界面改不了应用池标识时,用管理员命令行执行:

%windir%\system32\inetsrv\appcmd set apppool "NodeAppPool" /processModel.identityType:LocalSystem

把NodeAppPool替换成你的应用池名称,LocalSystem也可以换成NetworkService。这个命令能绕开图形界面的写入问题,直接改配置,十有八九能解决。

5.2 快速定位问题在 IIS 层还是 Node 层

排障最重要的是先分清楚问题出在哪一层,否则容易瞎折腾。我自己的排查顺序固定是四步:

第一步,在项目目录手动执行node app.js,直接访问 Node 自监听端口。能访问说明代码和依赖都没问题;这一步都报错,那就先修代码,别去动 IIS。

第二步,Node 层确认没问题,再用 IIS 站点的地址访问。此时如果报错,看 web.config 的stdoutLogFile日志,Node 进程的启动报错和运行堆栈都在里面。

第三步,看 IIS 日志。默认路径在C:\inetpub\logs\LogFiles\W3SVC*\,日志里能看到 HTTP 状态码。4xx说明请求到了 IIS 但被拒,5xx说明请求到了 IIS 但后端处理失败,502/503基本指向网关或进程问题。

第四步,打开 Windows 事件查看器 → Windows 日志 → 应用程序,找node.exe或w3wp.exe的崩溃记录。这一步能看到系统层面的错误信息,比如加载模块失败、内存不足等。

这套流程能解决九成以上的部署问题。比到处搜“报错代码”管用得多。

5.3 老版 iisnode 专项问题

老项目切 httpPlatformHandler 之前,如果还在用 iisnode,这几个坑要提前知道:

第一,位数必须匹配。Node 是 32 位还是 64 位,iisnode 模块也要对应位数,装反了进程起不来,报错还很难看懂。第二,通配符映射后,所有请求都进 Node,静态文件容易 404,这时要参考 4.4 节的 handler 拆分。第三,WebSocket 支持需要额外安装 IIS WebSocket Protocol 功能,否则前端的长连接会一直连不上。

遇到这些坑,我的建议是干脆迁方案。替换 web.config 为 httpPlatformHandler 写法,代码里保持process.env.PORT不变,应用本身几乎不用动。

6. 从“能跑”到“跑得稳”:托管后的进阶优化

6.1 环境变量与多环境配置

应用跑通只是开始,生产环境要考虑配置管理。在 web.config 的<httpPlatform>节点里,environmentVariables可以用来注入数据库连接、Redis 地址、第三方密钥等环境变量。

<environmentVariables> <environmentVariable name="NODE_ENV" value="production" /> <environmentVariable name="DB_HOST" value="192.168.1.10" /> </environmentVariables>

代码里统一用process.env.DB_HOST读取,不写死任何环境相关的值。开发、测试、生产多套环境部署时,每套环境的站点各自维护一份 web.config,代码只需要一份。要注意 web.config 修改会触发应用池回收,线上环境不要在请求高峰期频繁改动。

6.2 用 PM2 / NSSM 做进程守护:反向代理方案的补充

如果团队更习惯用 PM2 管理 Node 服务,可以走反向代理路线。Node 应用继续监听自己的端口(比如 3000),IIS 只负责接收外部请求并转发。

IIS 侧需要安装 URL Rewrite 和 ARR(Application Request Routing),启用代理功能,然后加一条转发规则,把所有请求重写到http://127.0.0.1:3000/{R:1}。Node 进程的守护交给 PM2:

npm install -g pm2 pm2 start app.js --name nodeapp pm2 save pm2 startup

Windows 服务方式可以用 NSSM:

nssm install NodeApp "C:\Program Files\nodejs\node.exe" "C:\inetpub\wwwroot\nodeapp\app.js"

这个方案的好处是 Node 进程的启停、日志、崩溃重启都沿用 Node 生态工具,团队迁移成本低;代价是 IIS 和 Node 之间存在两层维护体系。两种方案没有绝对优劣,看团队习惯。我个人在 Windows 服务器上更倾向 httpPlatformHandler,少一层服务少一份运维负担。

6.3 日志、监控与健康检查

部署完成不代表一劳永逸。日志和监控是维护阶段最值得投入的部分。

IIS 日志默认记录每次请求的时间、客户端 IP、请求路径、状态码,用来分析访问量和错误率足够。Node 进程自己的输出,通过stdoutLogFile收集。生产环境建议在应用里用日志库输出 JSON 格式,包含时间戳、请求 ID、错误堆栈,排查问题时能直接按关键字检索,效率和看白茫茫一片的console.log完全不同。

健康检查也是我强烈建议做的:给应用加一个/health接口,返回简单的 JSON 状态,外部监控系统每隔几十秒请求一次,一旦连续失败就自动回收应用池或重启 IIS。这个方法成本极低,但能有效缩短故障发现时间。

另外,IIS 的“失败请求跟踪”功能(Failed Request Tracing)对排查 500 错误非常有用。可以在站点层面配置跟踪规则,指定哪些 HTTP 状态码需要记录详细过程,然后重放问题请求,就能看到请求在 IIS 管道里从进入到离开的全过程,精确定位是 handler 没匹配上、权限不够,还是进程没有起来。

我个人在实际操作中的体会是,部署 Node 到 IIS 真正难的不是“让页面跑起来”,而是把进程生命周期、日志、权限这三件事理顺。一旦理顺,IIS 的可靠性确实比裸命令行高得多,尤其是运维交接的时候,接管方不需要懂 Node 的启动细节,一切按 IIS 的标准流程走就行。

最后再分享一个小技巧:改完 web.config 后如果觉得没生效,先在 IIS 管理器里把对应应用池回收一下再刷新页面,能省掉很多“明明改了半天却没变化”的烦躁。上生产之前,记得先把C:\Windows\System32\inetsrv\config\applicationHost.config备份一次,我习惯把备份放到独立目录,万一配置改崩,一份文件拖回去就能还原,比在图形界面里一点点重配快太多了。

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

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

立即咨询