如何在IIS上部署Node.js实现Angular 4+应用服务端渲染?
在IIS上部署Angular Universal(Node.js驱动)的可行方案
我太懂你现在的纠结了——Angular SPA扔IIS上SEO拉胯,好不容易用Angular Universal在Node.js上跑通了服务端渲染,结果发现依赖的iisnode早就停更了,谁敢用一个没人维护的工具啊!别慌,给你两个靠谱的替代方案,完美解决IIS+Node.js+Angular Universal的部署问题:
方案一:用IIS的ARR反向代理(最稳定通用)
这是目前业内最推荐的方式,不需要依赖第三方工具,靠IIS原生模块就能实现请求转发,把静态资源交给IIS处理,动态渲染请求甩给Node.js服务器。
具体步骤:
- 先把你的Angular Universal项目打包好:跑
npm run build:ssr(具体命令看你的项目配置),生成dist目录下的server和browser两个文件夹 - 安装IIS必备模块:在服务器管理器里添加「Application Request Routing Cache」和「URL Rewrite」模块,这俩是IIS做反向代理的核心
- 托管Node服务:用PM2这类进程管理器启动Node渲染服务,比如在项目根目录跑
pm2 start dist/server/main.js --name angular-ssr,这样就算终端关了,服务也能后台运行,崩溃了还能自动重启 - 配置IIS网站:新建一个IIS站点,绑定好你的域名/端口,把站点物理路径指向Angular打包后的
browser文件夹(静态资源由IIS直接返回) - 添加URL Rewrite规则:
- 打开站点的「URL Rewrite」功能,新建空白规则
- 匹配URL填
.*(匹配所有请求) - 添加条件:
{REQUEST_FILENAME}不匹配^.+——意思是如果请求不是静态文件(比如HTML路由请求),才转发给Node服务 - 操作选「反向代理」,输入Node服务的地址(比如
http://localhost:4000,看你Node服务的监听端口),如果用HTTPS就勾选「启用SSL卸载」
这样一来,用户访问你的域名时,静态资源直接由IIS快速返回,需要服务端渲染的路由请求就转发到Node服务器处理,SEO和性能都兼顾了。
方案二:ASP.NET Core集成Node.js(适合.NET同服务器场景)
既然你的后端本身就是C#.NET,那可以把Angular Universal的Node服务和.NET后端集成到一起,部署起来更统一。
步骤如下:
- 把Angular Universal打包后的
server和browser文件夹复制到ASP.NET Core项目的wwwroot目录下 - 在ASP.NET Core的
Startup.cs里配置反向代理中间件,把非静态请求转发到Node服务:public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 先处理静态资源(Angular的browser打包内容) app.UseStaticFiles(); // 配置反向代理到Node渲染服务 var proxyOptions = new ProxyOptions { Target = new Uri("http://localhost:4000") }; app.UseProxy(proxyOptions); // 其他后端中间件配置... } - 同样用PM2或者Windows服务托管Node服务,保证ASP.NET Core启动时Node服务也在运行
- 最后把ASP.NET Core项目正常部署到IIS上就行,这样.NET后端和Angular SSR服务就共用一个IIS站点了
几个关键注意事项
- 进程托管:绝对不能手动启动Node服务就完事,一定要用PM2或者Windows服务托管,避免服务器重启或者终端关闭导致服务挂掉
- 端口冲突:Node服务的监听端口要和IIS站点的绑定端口区分开,别搞混了
- HTTPS配置:SSL证书直接在IIS上配置,反向代理启用SSL卸载,Node服务只需要处理HTTP请求就行,不用额外配置Node的HTTPS
- 性能优化:在IIS里给静态资源开启缓存,减少Node服务的压力;同时给Node服务分配足够的内存,避免大流量时OOM
内容的提问来源于stack exchange,提问作者jalak vora
相关产品推荐
相关产品推荐

