如何在不使用自定义服务器的前提下将NextJS部署到IISNode?
部署Next.js到IISNode并保留SSR/SSG功能的可行方案
核心思路
无需自定义服务器,直接使用Next.js官方的next start启动生产服务器,通过IISNode将IIS的请求转发至该官方服务器,即可完整保留SSR、SSG及ISR的原生功能——这是官方推荐的生产部署方式,不会丧失任何框架原生能力。
前置准备
- 服务器需安装:IIS、IISNode、对应版本的Node.js(匹配你的Next.js版本要求)、URL Rewrite模块
- 本地完成项目生产构建:执行
next build生成.next目录,确保package.json中包含start脚本(默认是next start -p 3000,可按需修改端口)
web.config配置示例
<configuration> <system.webServer> <!-- 注册IISNode处理器 --> <handlers> <add name="iisnode" path="server.js" verb="*" modules="iisnode" /> </handlers> <!-- URL重写规则:优先处理静态资源,动态请求转发至Next.js服务器 --> <rewrite> <rules> <!-- 直接处理Next.js生成的静态资源,跳过Node服务器 --> <rule name="NextStaticAssets" stopProcessing="true"> <match url="^/_next/static/.*$" /> <action type="Rewrite" url="{R:0}" /> </rule> <!-- 处理根目录静态文件 --> <rule name="RootStaticFiles" stopProcessing="true"> <match url="^/(favicon.ico|robots.txt|sitemap.xml)$" /> <action type="Rewrite" url="{R:0}" /> </rule> <!-- 所有非文件/非目录请求转发至Next.js服务器 --> <rule name="ForwardToNextServer"> <match url=".*" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="server.js" /> </rule> </rules> </rewrite> <!-- IISNode基础配置 --> <iisnode node_env="production" nodeProcessCommandLine=""C:\Program Files\nodejs\node.exe"" logDirectory="iisnode/logs" debuggingEnabled="false" /> <!-- 补充静态资源MIME类型,避免解析错误 --> <staticContent> <mimeMap fileExtension=".json" mimeType="application/json" /> <mimeMap fileExtension=".js" mimeType="application/javascript" /> </staticContent> </system.webServer> </configuration>
配套server.js脚本
IISNode需要一个入口脚本,这里我们仅做启动Next.js官方服务器的封装,并非自定义渲染逻辑:
const { createServer } = require('http') const { parse } = require('url') const next = require('next') // 固定为生产模式 const dev = false const app = next({ dev }) const handle = app.getRequestHandler() app.prepare().then(() => { createServer((req, res) => { const parsedUrl = parse(req.url, true) handle(req, res, parsedUrl) }).listen(process.env.PORT || 3000, (err) => { if (err) throw err console.log('Next.js production server started') }) })
关键注意事项
- 部署到IIS的文件需包含:
.next目录、server.js、package.json、next.config.js(如有)及所有项目静态资源 - 服务器Node.js版本需与本地开发环境一致,避免兼容性问题
- 若修改端口,需同步更新
server.js监听端口、package.json的start脚本端口,以及IIS站点绑定配置 - SSG生成的静态HTML会直接由IIS处理,性能更优;SSR请求则转发至Next.js官方服务器处理,完全保留原生渲染能力
内容的提问来源于stack exchange,提问作者Alvin Stefanus
相关产品推荐
相关产品推荐

