昨天晚上一个学弟的紧急求救,说了自己接的单子做了一个网站,使用了自己熟悉的技术——node.js+mongdb,但当看到部署环境惊呆了,是 windows+sqlserver。这些都不是关键,关键是服务器已经用iis7跑了很多网站,很明显80端口已经被占用了,瞬间只能拍大腿了。

当听完他的描述后,微微一笑,安慰他说,你应该庆幸你是用node写完发现是windows+sqlserver环境,要是你 用.net+sqlserver写完发现是linux系统你才更应该要跳楼吧。node.js跨平台,mangodb也跨平台怕毛啊。windows server 2008服务器部署软件一向都是傻瓜式的操作,只要不用太担心安全性和运行效率,大可放心。node.js跨平台,安装so easy,mangodb跨平台,安装也so easy,node本身就起到web服务器的功能这跟php或者asp这些存动态脚本语言有些不一样,所以学弟在开发的时候基本这两个东西就可以完成解决 所有问题了。现在到部署了,难道也像开发那样,cmd敲入node index.js,然后访问ip已经绑定的端口吗,似乎行得通。可客户可不容易妥协,说好的域名绑定呢,说好的一不小心关了那个运行node的cmd呢。 他们所要的效果,简单的说就是,通过域名可以访问其用node写的网站。

起初我想着很简单啊,之前自己有试着部署node写的一个轻博客平台-ghost,都是用一个web服务器去代理,我使用的是nginx,稍微配置下既可 以绑定域名,又可以将其转发到node网站所使用的端口。我服务器所有的web服务都是通过nginx来代理的,比如nginx转发请求到tomcat, 不仅如此还可以做负载均衡,此外通过php-fpm链接php程序,当然代理node网站程序也是轻而易举。不得不说nginx是个极其优秀的web服务 程序,一直想花点时间阅读其源代码,可以玩性太重,一到假日就懒虫泛滥。

但是问题没那么简单,如果可以使用这么好的nginx工具,也不会有文题提到的iis了。这是因为服务器已经跑了很多老网站了,人家运行的好好的啊,那 80端口只有一个,被他占用了怎么办。当然可以使用nginx转发所有请求,也就是将nginx作为web服务器的门户使用80端口,所有经过80端口的 web访问都通过nginx转发,通过配置可以将对应主机头的访问转发到对应的iis上去。但这工作量大,而且有脱裤子放屁的嫌疑,因为已经有一个iis 作为网站服务了,想来想去只能拿iis开刀了。

要在iis部署node,我想需要解决两个问题,第一个是打开iis的rewrite功能,第二个让iis与node要建立联系。我在Google打入iis部署node程序,很快出现了我想要的结果,我发现这么一个好东西IISnode,网站https://github.com/WindowsAzure/iisnode, 它实现的是一个IIS Module,全局加载到IIS中以后,就可以在任意一个站点中,通过Web.config来指定把某些路径转交给node程序来解释执行,同时可以配置 一些额外参数,比如启动多少个nodejs进程,每个进程最大允许多少个连接,允许多少个等待中的连接等等。而且这个module本身还有监视站点文件变 化的功能,当你修改了某个js文件,它可以自动重启加载。

现在简单将过程帖一下吧:

首先安装node,这个太简单了,windows提供的node包甚至直接省去了环境变量的设置,故自行google之 http://nodejs.org/

再安装IIS的URL Rewrite模块,http://www.iis.net/downloads/microsoft/url-rewrite.打开连接捏一把冷汗,支持的iis版本是7以上,抓住了青春的尾巴。

再就是安装iisnode了,iisnode代码托管在github上,这里也提供了稳定发布版的二进制文件了,懒得自己编译了就直接下载合适的版本了

https://github.com/tjanczuk/iisnode/releases/download/v0.2.11/iisnode-full-v0.2.11-x64.msi

各软件的安装过程,直接跳过,最关键的一步还是配置,我clone了一下github上的源代码,简单读了下wiki以及sample,发现用法很简单。 首先还是利用iis超人性化的操作新建一个web程序,设置好虚拟路径,绑定主机头等,再在网站根目录下新建立一个文件web.config这跟 asp.net有点像,这个文件主要就是设置一下rewrite转发以及nodeiis所使用的一些参数等。这里贴一个最最简单的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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>

大概意思就是说,所有对虚拟目录的请求都转发到node的app.js,并指定了node脚本的执行目录。更多配置阅读相关文档。

app.js

1
2
3
4
5
6
var http = require('http');
 
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('You have reached the default node.js application at index.js! [defaultdocument sample]');
}).listen(process.env.PORT);

重启iis相关网站,出现这么一句话,表示一切OK了

You have reached the default node.js application at index.js! [defaultdocument sample]

总结:

解决问题的方法通常不止一种,难的是选择一种最简单合理的方式。就比如上面这个问题,如果没有iisnode这么好一个组件,很可能就要饶一个圈子了。再次感谢强大的开源社区。

相关链接:

https://github.com/Azure/iisnode

http://www.unfish.net/archives/816-20131218.html

http://www.iis.net/downloads/microsoft/url-rewrite

http://heeroluo.net/article/detail/118/suffering-from-iisnode

记录下使用iis7代理node.js写的网站程序的更多相关文章

  1. 用Node.js写爬虫,撸羞羞的图片

    说到爬虫,很多人都认为是很高大上的东西.哇塞,是不是可以爬妹纸图啊,是不是可以爬小片片啊.答案就是对的.爬虫可以完成这些东西的操作.但是,作为一个正直的程序员,我们要在法律允许范围内用爬虫来为我们服务 ...

  2. 使用 Node.js 写一个代码生成器

    背景 第一次接触代码生成器用的是动软代码生成器,数据库设计好之后,一键生成后端 curd代码.之后也用过 CodeSmith , T4.目前市面上也有很多优秀的代码生成器,而且大部分都提供可视化界面操 ...

  3. Node.js写文件的三种方法

    Node.js写文件的三种方式: 1.通过管道流写文件 采用管道传输二进制流,可以实现自动管理流,可写流不必当心可读流流的过快而崩溃,适合大小文件传输(推荐) var readStream = fs. ...

  4. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  5. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  6. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

  7. apache2反向代理node.js应用

    在之前记录的随笔中,只是介绍了怎么在apache2中使用proxy模块,后来查到了一些资料,可以通过下面网址查看配置块的详细参数信息 http://man.ddvip.com/soft/apache2 ...

  8. Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城

    转载于这篇文章 关于pm2看这篇文章 最近在研究小程序,申请了域名之后,再一次来配置环境,根据作者的步骤基本上完成了网站的架构,但由于环境路径等不同,配置上会有所不同,因此记录下来. 1.更新系统和安 ...

  9. 用node.js写一个简单爬虫,并将数据导出为 excel 文件

    引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...

随机推荐

  1. java文件上传-使用apache-fileupload组件

    目前文件上传的(框架)组件:Apache----fileupload .Orialiy – COS – 2008() .Jsp-smart-upload – 200M. 用fileupload上传文件 ...

  2. Sequel-Model

    Sequel::Model Mass Assignment 大多数的Model方法接受一个包含一系列key和value的哈希作为参数,这些方法包括:Model.new, Model.create, M ...

  3. C# base和this ---转载 小昊

    new关键字引起了大家的不少关注,尤其感谢 Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在.所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关 ...

  4. Django的视图系统

    视图(views)概述 在前几篇文章中介绍了,client端通过http请求——去url的路由找到相应的视图函数——触发视图函数——再去modes取数据——取到数据后——再通过创建模——views函数 ...

  5. 解决iptables nat sctp协议无效的问题

    环境组网如下: A----->B-----C IP如下: A:1.1.1.1 B:1.1.1.2; 2.2.2.1 C:2.2.2.2 需求为,A 需要使用sctp连通C 在B机器上添加ipta ...

  6. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  7. springboot-8- 日志配置

    1, logback配置 springboot 默认支持logback, 自动加载classpath:logback-spring.xml <!-- logback多文件输出 --> &l ...

  8. 深入理解Java虚拟机:虚拟机类加载机制

    目录 7.1 概述 7.2 类加载的时机 类的生命周期 5种情况需要"初始化" 7.3 类加载的过程 1.加载 2.验证 3.准备 4.解析 5.初始化 7.4 类加载器 类与类加 ...

  9. Koa框架教程

    Node主要用在开发 Web 应用.这决定了使用 Node,往往离不开 Web 应用框架. Koa 就是一种简单好用的 Web 框架.它的特点是优雅.简洁.表达力强.自由度高.本身代码只有1000多行 ...

  10. 详解ruby的attr_accessor和cattr_accessor

    原文地址:http://lee2013.iteye.com/blog/1098914 1. attr_accessor的用法相当简单, 就相当于getter和setter,看一个类就知道怎样用了: c ...