最近比较喜欢用Node.js做一些简单的应用,一直想要部署到生产环境中,但是手上只有一台windows server 2008服务器,并且已经开启了IIS服务,运行了很多.Net开发的网站,80端口已经被占用了。

起初是想用nginx来作为web服务器监听80端口,将所有web访问转发到对应的IIS和node,但由于已运行的老站点众多,如此配置实在需要大量的精力,于是突发奇想,能不能直接利用IIS来托管node服务呢?进过一番搜索之后发现了iisnode模块,可以很轻松的解决这个问题。下面就把实操步骤分享出来,方便有同样需求的朋友参考。

首先iisnode是一个IIS Module加载到IIS以后,就可以在任意站点中通过Web.config指定某些路径转交给node程序执行,通过参数配置,可以设置启动的node进程个数,以及最大连接数等。并且可以监听站点文件变化,自动重启node服务等功能。

iisnode代码托管在github上,如果不想自己编译,可以直接通过以下链接下载适合自己的版本。

https://github.com/tjanczuk/iisnode/wiki/iisnode-releases

比如我的服务器是windows server 2008 64位系统,选择下载“iisnode for iis 7/8 (x64)”安装程序

只要版本正确,安装过程并没有需要特别注意的,自己根据提示一步一步完成即可。

之后还需要安装一下IIS的URL Rewrite模块(需要利用rewrite功能转发相关的请求交给node服务来执行)

下载地址:http://www.iis.net/downloads/microsoft/url-rewrite

软件全部安装完成之后,在IIS中新建网站,将目录指定到我们的nodejs应用目录即可,最后关键的一步,在目下新建web.config配置文件并写入如下的内容:

<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" resourceType="Unspecified" requireAccess="Script" />
</handlers> <rewrite>
<rules>
<rule name="all">
<match url="/*" />
<action type="Rewrite" url="app.js" />
</rule>
</rules>
</rewrite> <iisnode promoteServerVars="REMOTE_ADDR" />
</system.webServer>
</configuration>

作用是将当前目录的所有请求都利用iisnode模块转发到node服务,并指定了node的执行目录。其中的app.js就是node应用的入口文件(可以按照自己的目录结构进行修改)。

一切就绪,现在打开浏览器访问网站,就可以看到效果了。

如果运行的时候出现如下错误:

500.19
配置错误 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny" 或旧有的 allowOverride="false" 的位置标记明确设置的。

通过cmd运行如下代码即可解决:

%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers

其中的handlers是报错的节点名字。

另外如果是Express的项目,建议把web.config文件改为如下内容

<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="launch.js" verb="*" modules="iisnode" resourceType="Unspecified" requireAccess="Script" />
</handlers> <rewrite>
<rules>
<rule name="all">
<match url="/*" />
<action type="Rewrite" url="launch.js" />
</rule>
</rules>
</rewrite> <iisnode promoteServerVars="REMOTE_ADDR" />
</system.webServer>
</configuration>

并新建程序入口文件launch.js 代码如下:

#!/usr/bin/env node

require('./bin/www');

如此操作的原因请参考博文:http://heeroluo.net/article/detail/118/suffering-from-iisnode

如果出现如下错误:

The iisnode module is unable to start the node.exe process. Make sure the node.exe executable is available at the location specified in the system.webServer/iisnode/@nodeProcessCommandLine element of web.config. By default node.exe is expected in one of the directories listed in the PATH environment variable

解决方法:在web.config 中的 system.webServer 节点加上以下内容:

<iisnode watchedFiles="*.js;node_modules\*;routes\*.js;views\*.jade"  nodeProcessCommandLine="C:\Program Files\node.exe"/>
nodeProcessCommandLine的值为您node的路径

完整示例:
<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="launch.js" verb="*" modules="iisnode" resourceType="Unspecified" requireAccess="Script" />
</handlers> <rewrite>
<rules>
<rule name="all">
<match url="/*" />
<action type="Rewrite" url="launch.js" />
</rule>
</rules>
</rewrite> <iisnode promoteServerVars="REMOTE_ADDR" watchedFiles="*.js;node_modules\*;routes\*.js;views\*.jade" nodeProcessCommandLine="C:\Program Files\node.exe"/>
  </system.webServer>
</configuration>

利用iisnode模块,让你的Node.js应用跑在Windows系统IIS中的更多相关文章

  1. node.js安装和配置(windows系统)

    node.js安装和配置(windows系统) node javasript vscode  node是javascript的管理工具,所以开发javasript项目都要下载安装和配置node. 传送 ...

  2. 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    [摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...

  3. 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    目录 一. 概述 二. 线程与进程 三. cluster模块源码解析 3.1 起步 3.2 入口 3.3 主进程模块master.js 3.4 子进程模块child.js 四. 小结 示例代码托管在: ...

  4. Node.js学习笔记(二) --- CommonJs和Nodejs 中自定义模块

    一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一 ...

  5. 利用forever在Linux上实现Node.js项目自启动

    在一台计算机上手动跑Node项目简单,node xx.js就搞定了,想让Node项目后台执行,尽管不能直接用node命令搞定,可是在安装了forever这个包以后.还是非常轻松的.只是要是在远程ser ...

  6. 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)

    [摘要] cluster模块详解 示例代码托管在:http://www.github.com/dashnowords/blogs 阅读本章需要先阅读本系列前两章内容预热一下. 一. 引言 前两篇博文中 ...

  7. 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)

    目录 一. 引言 二.server.listen方法 三.cluster._getServer( )方法 四.跨进程通讯工具方法Utils 五.act:queryServer消息 六.轮询调度Roun ...

  8. mime模块响应或设置Node.js的Content-Type头

    转载自:https://itbilu.com/nodejs/core/VJYaAfKrl.html   MIME,即:Multipurpose Internet Mail Extensions,多用途 ...

  9. 学信网改绑手机号码,但是忘记了老号码怎么办?利用node.js + puppeteer 跑脚本实现改绑手机号

    最近登录学信网发现自己学信网上绑定的手机号码不是目前自己使用的手机号码,于是想改绑手机号,但是发现不记得之前的手机号码了: 于是百度各种方法都无济于事:也不想重新注册账号,最后看见一篇文章通过Pyth ...

随机推荐

  1. 【全面解禁!真正的Expression Blend实战开发技巧】第四章 从最常用ButtonStyle开始 - PathButton

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第四章 从最常用ButtonStyle开始 - PathButton 上一篇我们介绍了TextButton,但为了追求界面的张力, ...

  2. Android 9.0 Dialog不显示

    Tester报了一个bug,大概如下: 页面:Activity1 dialog1(半透明遮罩样式) Activity2 dialog2 场景:Activity1弹出dialog1,dialog1弹出a ...

  3. Android零基础入门第24节:自定义View简单使用

    原文:Android零基础入门第24节:自定义View简单使用 当我们开发中遇到Android原生的组件无法满足需求时,这时候就应该自定义View来满足这些特殊的组件需求. 一.概述 很多初入Andr ...

  4. myCloudData SDK

    http://www.tmssoftware.com/site/myclouddata.asp http://www.tmssoftware.com/site/myclouddatasdk.asp

  5. 教你如何在Deepin搭建Qt开发环境(sudo apt-get install qt5-default qt5-qmake g++ qtcreator,也许对龙芯版的Deepin也有用)

    首先教大家一种很简单的方法,打开终端输入以下命令: sudo apt-get install qt5-default qt5-qmake g++ qtcreator 上面的命令会自动帮你安装qt5开发 ...

  6. Qt5.5以来对Network的改进(包括对SSL的功能支持,HTTP的重定向等等)

    Qt Network New SSL back-end for iOS and OS X based on Secure Transport. Note that in Qt 5.6 this wil ...

  7. 什么水平算精通C++ Builder?

    主 题:   大家讨论一下什么水平算精通C++ Builder?(我这样算什么,马上要毕业了,不知道如何评价自己)         //C++ builder 使用时间3年 熟悉VCL源代码 开发过3 ...

  8. java中的String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  9. 浅谈我在.net core一年里的收获

    前言:以前一直在winserver的环境里从事web工作,安装一个sqlserver,iis,把项目部署上面就OK了,简单轻松一.结缘nginx以前一直听说nginx这个反向代理的web服务器,当玩n ...

  10. ES6 新增声明变量的 var let const 的区别详解

    var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域. let 1.let 声明的变量具有块作用域的特征 ...