如何关闭Terminal/VSCode后仍保持NextJS应用在Windows Server运行?
解决Windows Server上IIS部署NextJS后关闭终端/VSCode仍运行的问题
你之前直接在终端/VSCode里启动NextJS进程的方式,一旦关闭窗口进程就会终止。要实现后台常驻,核心是把Node进程转为系统级的后台服务,以下是几种可靠方案:
方案一:注册为Windows服务(推荐)
这种方式让进程完全脱离终端,由Windows服务管理器托管,稳定性最高:
- 先完成NextJS应用构建:
npm run build - 全局安装
node-windows工具:npm install -g node-windows - 在项目根目录创建
service.js脚本,内容如下:const Service = require('node-windows').Service; const path = require('path'); const svc = new Service({ name: 'NextJS-你的应用名称', description: '后台运行的NextJS应用服务', script: path.join(__dirname, 'server.js') // 指向自定义启动脚本 }); svc.on('install', () => svc.start()); svc.install(); - 编写
server.js启动脚本(适配NextJS的生产环境启动):const next = require('next'); const { createServer } = require('http'); const { parse } = require('url'); const app = next({ dev: false }); const handle = app.getRequestHandler(); app.prepare().then(() => { createServer((req, res) => { const parsedUrl = parse(req.url, true); handle(req, res, parsedUrl); }).listen(3000, () => { console.log('> 应用已启动在 http://localhost:3000'); }); }); - 在终端执行
node service.js完成服务安装,之后可在「Windows服务管理器」找到该服务,设置为自动启动 - 配置IIS反向代理:安装URL重写和ARR模块,创建网站后添加重写规则,将请求转发到
http://localhost:3000/{R:1}
方案二:用PM2托管进程
PM2是Node.js进程管理工具,支持Windows环境:
- 安装PM2:
npm install -g pm2 - 构建应用:
npm run build - 启动并命名进程:
pm2 start npm --name "你的应用名" -- start - 保存进程列表,防止重启丢失:
pm2 save - 将PM2注册为Windows服务,实现开机自启:
pm2-windows-service install - 同样需要配置IIS反向代理,将请求转发到NextJS的端口(默认3000)
方案三:用iisnode直接托管(集成IIS)
借助iisnode模块让IIS直接管理Node进程,无需额外服务:
- 安装对应IIS版本的iisnode模块
- 项目根目录创建
web.config,配置规则:<configuration> <system.webServer> <handlers> <add name="iisnode" path="server.js" verb="*" modules="iisnode" /> </handlers> <rewrite> <rules> <rule name="跳过调试路径" patternSyntax="ECMAScript" stopProcessing="true"> <match url="^server.js\/debug[\/]?" /> </rule> <rule name="静态资源转发"> <action type="Rewrite" url="public{REQUEST_URI}" /> </rule> <rule name="动态请求转发"> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" /> </conditions> <action type="Rewrite" url="server.js" /> </rule> </rules> </rewrite> <iisnode node_env="production" /> </system.webServer> </configuration> - 编写和方案一相同的
server.js启动脚本,部署到IIS网站后,iisnode会自动启动并维护Node进程,无需手动在终端启动
内容的提问来源于stack exchange,提问作者Kubilay
相关产品推荐
相关产品推荐

