昨天晚上一个学弟的紧急求救,说了自己接的单子做了一个网站,使用了自己熟悉的技术——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. 两个字符串 char* a, char* b,输出b在a中的位置次序。

    /** 题目: 两个字符串 char* a, char* b,输出b在a中的位置次序. void output_postion(const char* a, const char* b); 如:a = ...

  2. springboot-4-整合fastjson

    使用fastjson作为springboot的默认json解析, 原来使用的是jackson 1, 引入依赖 <dependencies> <dependency> <g ...

  3. C语言中的条件编译

    通常情况,我们想让程序选择性地执行,多会使用分支语句,比如if-else 或者switch-case 等.但有些时候,可能在程序的运行过程中,某个分支根本不会执行. 比如我们要写一个跨平台项目,要求项 ...

  4. linux下软、硬链接的创建和删除

    linux下软.硬链接的创建和删除 在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复 ...

  5. git常用命令小记

    git status 查看缓存区和工作区的状态 +表示N个新文件 ~表示N个修改 -表示N个删除 两组的时候前面的是暂存区,后面的是工作区 git add fileName 变更文件状态(工作区--& ...

  6. mvc中的action验证登录(ActionFilterAttribute)

    方法一 :  1.创建一个全局action过滤器  (在appstart  的filterconfig中注册   filters.Add(new LoginAttribute());)  2.不需要登 ...

  7. JPA之@Entity、@Table、@Column、@Id

    Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库.这些普通Java对象被称作Entity Bean.除了是用Java Persis ...

  8. BG.Sqoop

    1. 下载 Sqoop,并复制到虚拟机 http://sqoop.apache.org/ 2. 安装Sqoop tar zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha. ...

  9. 打造自己的LinQProvider(四)

    打造自己的LinqProvider *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  10. FOR XML PATH做为数据表中单列或者多列的字符串拼接的方法,放到一列中去,很好用。

    先看看自己弄得例子,SELECT sName+',',hoppy+','  FROM student2 where hoppy='游泳' FOR XML PATH('')--PATH后面跟的是行标题, ...