运行Node.js的IIS扩展iisnode安装配置笔记

 这篇文章主要介绍了运行Node.js的IIS扩展iisnode安装配置笔记,iisnode的扩展可以把Node.js程序托管到IIS,托管之后也意味着可以使用IIS里面的各种功能,需要的朋友可以参考下

 
 

今年年初打算用Node.js基于Express框架重写博客程序,从此告别ASP.NET。然而,我目前用的VPS是Windows Server系统、IIS服务器,如果让Express和IIS都监听80端口,明显会产生冲突。幸好,有一个叫做iisnode的扩展可以把Node.js程序托管到IIS。而且,这样托管之后也意味着可以使用IIS里面的各种功能(进程管理、GZip压缩、日志、缓存、权限控制、域名绑定等)。

要使用iisnode,得安装:

1.Node.js
2.IIS的URL Rewrite模块
3.iisnode

装好之后,还是按照常规操作,在IIS管理器中创建站点,指向Express程序的目录,关键是还要增加一个web.config文件:

代码如下:

<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="bin/www" verb="*" modules="iisnode" resourceType="Unspecified" requireAccess="Script" />
</handlers>

 

<rewrite>
<rules>
<rule name="all">
<match url="/*" />
<action type="Rewrite" url="bin/www" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

 

这段内容也可以通过IIS管理器的可视化界面配置。大概意思把所有请求重写到bin/www,而且使用iisnode扩展运行bin/www。然而,打开站点后,却出现了这样的错误提示:

复制代码 代码如下:

请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径

起初是觉得不明所以,后来突然醒悟,ASP.NET里面的bin目录是个不允许访问的特殊目录。把请求重写到bin/www,恰好命中了这条规则。所以呢,改一下目录名就好了,比如把bin改成launch(事实证明这不是好做法,后面再说),web.config也要对应调整:
代码如下:

<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="launch/www" verb="*" modules="iisnode" resourceType="Unspecified" requireAccess="Script" />
</handlers>

 

<rewrite>
<rules>
<rule name="all">
<match url="/*" />
<action type="Rewrite" url="launch/www" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

 

在IIS管理器中重启站点后再次访问,终于运行起来了,不容易啊!不过还是高兴得太早了。

在测试程序功能的过程中,竟然发现获取到的IP为空。在Express框架中,IP是通过req.ip获取的,而req.ip又是从请求头的REMOTE_ADDR获取值。通过一段简单的测试代码,发现REMOTE_ADDR的值也为空。很明显,从IIS到Node.js的过程中,这段头信息丢失了。Google一番之后,发现iisnode确有此问题,官方提供的解决方案是使用X-Forword-For,不过我又发现了另外一个办法。

Web.config中有一段配置(加到</system.webServer>前)可以保留REMOTE_ADDR:

代码如下:

<iisnode promoteServerVars="REMOTE_ADDR" />

 

根据说明,保留的REMOTE_ADDR会被改名为x-iisnode-REMOTE_ADDR,所以还得把req.ip的值覆盖一次,在Express的app.js中增加一个中间件函数:

代码如下:

app.use(function(req, res, next) {
req.ip = req.headers['x-iisnode-REMOTE_ADDR'];
next();
});

然而,这样调整后,获取到的IP还是空,这不免让人怀疑,req.ip的赋值是不是失败了。看一下Express的源代码可以发现,req.ip是通过define getter的方式定义的,所以要覆盖它就得再define一次:
代码如下:

app.use(function(req, res, next) {
Object.defineProperty(req, 'ip', {
get: function() { return this.headers['x-iisnode-REMOTE_ADDR']; }
});
next();
});

 

这样问题终于解决了,但这不是一个好方法,要是以后Express把req.ip设成只读就麻烦了。

继续测试,又发现另外一个问题。正常来说,博客后台的文件上传功能会把文件传到public/upload这个目录下,但实际上却在launch目录(即原来的bin目录)下生成了public/upload文件夹。其实原因是作为程序入口的www文件是在launch目录下,所以launch目录成了应用程序的执行目录。我的解决办法是,把launch目录的名字改回bin,在根目录下创建一个launch.js去调用bin/www:

代码如下:

#!/usr/bin/env node

 

require('./bin/www');

 

然后把程序入口改为launch.js:

 

代码如下:

<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>

 

显然,iisnode还不是一个成熟的产品,当然Node.js也不是(至今还没1.0),一切都有待进一步探索和完善。

时间: 2024-10-30 21:47:37

运行Node.js的IIS扩展iisnode安装配置笔记的相关文章

微软开源Chakra,并计划在上面运行Node.js

微软兑现了开放Edge浏览器JavaScript虚拟机的承诺,遵循宽松的MIT许可协议开放了Chakra的源代码.开源代码以ChakraCore的名称发布,基本上同微软用于Edge和通用Windows平台(UWP)的VM是同一个,只是去掉了同Edge和UWP的绑定以及部分COM诊断API. ChakraCore是作为一个嵌入式引擎推出的,可以包含到各种桌面.服务器和IoT应用程序中,微软希望开发者发现它在这个方面的用途.该引擎使用JavaScript运行时(JSRT)API进行了封装,后者提供了

IIS+PHP+MYSQL安装配置方法_win服务器

一.安装php 1) 在D盘新建一个名为PHP的文件夹,解压缩php-5.2.0-win32.zip到D:\PHP. 2) 在D:\PHP文件夹下找到php.ini-dist文件,将其复制一份以做备份.将复制后的文件更名为php-ini. 3) 在php.ini文件中找到以下行:extension_dir = "./"(注:该行指定PHP查找扩展的位置),编辑该行,如下所示: extension_dir = "D:/PHP/ext"(注:不要这里用的是斜杠/而不是反

Win7下IIS 7的安装配置与文件

  windows 7的IIS的安装与配置: 安装方法 1:通过用户界面安装 1.单击"开始"/"控制面板"/"程序",选择"打开或关闭Windows功能". 2.在Windows 功能对话框中,选中"Internet信息服务" 3.单击"确定",这时Windows Vista就会启动IIS的安装过程; 注意,如果你用上述步骤安装,得到的是默认的安装,也就是最少的功能.如果你需要额外的I

IIS 7.0安装配置方法图文教程(win7)_win服务器

今天小编为大家带来一篇Win7系统下IIS7的详细安装配置图文教程,需要的朋友可以看看! Win7系统下IIS7安装方法: 1.通过用户界面安装 1.单击"开始"/"控制面板"/"程序",选择"打开或关闭Windows功能" 2.在Windows 功能对话框中,选中"Internet信息服务" 3.单击"确定",这时Windows Vista就会启动IIS的安装过程; 系统之家提醒您:如

Windows 7中安装iis教程 Win7安装配置iis方法图解

小编带来了win7 iis安装教程,很多朋友对于win7安装配置iis的步骤还不是很了解,那么就可以参考下文哦~如果你需要在电脑上安装iis却不知道步骤的话,希望下文能帮到你.   一.打开控制面板,点击"程序与功能".     二.点击左侧"打开或关闭Windows功能".     三.找到"Internet 信息服务",按照下图打勾即可.     四.安装完成后,再回到控制面板里面,找到"管理工具".     双击&quo

Redis主从及其PHP扩展的安装配置

1.Redis简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入

Centos 6.3下rsync+sersync安装配置笔记

最近单位活比较多,所以就很少更新,晚上上网碰巧看到一篇关于sersync的介绍,个人感觉较rsync+inotify配置更加规范,刚好最近手痒,就总结了下,分享给大家. 目前业内比较靠谱的同步解决方案有: rsync+inotify-tools,Openduckbill+inotify-tools和rsync+sersync 前两者由于是基于脚本语言编写,所以规范程度,执行效率相对rsync+sersync就稍微弱一些. sersync是使用c++编写,基于boost1.43.0,inotify

GitLab 安装配置笔记(转)

GitLab的安装方式 GitLab的两种安装方法: 编译安装 优点:可定制性强.数据库既可以选择MySQL,也可以选择PostgreSQL;服务器既可以选择Apache,也可以选择Nginx. 缺点:国外的源不稳定,被墙时,依赖软件包难以下载.配置流程繁琐.复杂,容易出现各种各样的问题.依赖关系多,不容易管理,卸载GitLab相对麻烦. 通过rpm包安装 优点:安装过程简单,安装速度快.采用rpm包安装方式,安装的软件包便于管理. 缺点:数据库默认采用PostgreSQL,服务器默认采用Ngi

centos下php redis扩展的安装配置3种方法

方法一 1.下载php redis扩展包  代码如下 复制代码 #wget http://redis.googlecode.com/files/redis-2.4.4.tar.gz 2 tar -zxvf 解压压缩包,cd /扩展包 ( 进入扩展包然后 运行phpize 一下是我环境中phpize的目录, /usr/local/php/bin/phpize (一定要在扩展包目录中运行 否则会报错) ) 3   代码如下 复制代码 ./configure –with-php-config=/usr