记录下使用iis7代理node.js写的网站程序
昨天晚上一个学弟的紧急求救,说了自己接的单子做了一个网站,使用了自己熟悉的技术——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写的网站程序的更多相关文章
- 用Node.js写爬虫,撸羞羞的图片
说到爬虫,很多人都认为是很高大上的东西.哇塞,是不是可以爬妹纸图啊,是不是可以爬小片片啊.答案就是对的.爬虫可以完成这些东西的操作.但是,作为一个正直的程序员,我们要在法律允许范围内用爬虫来为我们服务 ...
- 使用 Node.js 写一个代码生成器
背景 第一次接触代码生成器用的是动软代码生成器,数据库设计好之后,一键生成后端 curd代码.之后也用过 CodeSmith , T4.目前市面上也有很多优秀的代码生成器,而且大部分都提供可视化界面操 ...
- Node.js写文件的三种方法
Node.js写文件的三种方式: 1.通过管道流写文件 采用管道传输二进制流,可以实现自动管理流,可写流不必当心可读流流的过快而崩溃,适合大小文件传输(推荐) var readStream = fs. ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例
前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...
- apache2反向代理node.js应用
在之前记录的随笔中,只是介绍了怎么在apache2中使用proxy模块,后来查到了一些资料,可以通过下面网址查看配置块的详细参数信息 http://man.ddvip.com/soft/apache2 ...
- Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城
转载于这篇文章 关于pm2看这篇文章 最近在研究小程序,申请了域名之后,再一次来配置环境,根据作者的步骤基本上完成了网站的架构,但由于环境路径等不同,配置上会有所不同,因此记录下来. 1.更新系统和安 ...
- 用node.js写一个简单爬虫,并将数据导出为 excel 文件
引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...
随机推荐
- java文件上传-使用apache-fileupload组件
目前文件上传的(框架)组件:Apache----fileupload .Orialiy – COS – 2008() .Jsp-smart-upload – 200M. 用fileupload上传文件 ...
- Sequel-Model
Sequel::Model Mass Assignment 大多数的Model方法接受一个包含一系列key和value的哈希作为参数,这些方法包括:Model.new, Model.create, M ...
- C# base和this ---转载 小昊
new关键字引起了大家的不少关注,尤其感谢 Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在.所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关 ...
- Django的视图系统
视图(views)概述 在前几篇文章中介绍了,client端通过http请求——去url的路由找到相应的视图函数——触发视图函数——再去modes取数据——取到数据后——再通过创建模——views函数 ...
- 解决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 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- springboot-8- 日志配置
1, logback配置 springboot 默认支持logback, 自动加载classpath:logback-spring.xml <!-- logback多文件输出 --> &l ...
- 深入理解Java虚拟机:虚拟机类加载机制
目录 7.1 概述 7.2 类加载的时机 类的生命周期 5种情况需要"初始化" 7.3 类加载的过程 1.加载 2.验证 3.准备 4.解析 5.初始化 7.4 类加载器 类与类加 ...
- Koa框架教程
Node主要用在开发 Web 应用.这决定了使用 Node,往往离不开 Web 应用框架. Koa 就是一种简单好用的 Web 框架.它的特点是优雅.简洁.表达力强.自由度高.本身代码只有1000多行 ...
- 详解ruby的attr_accessor和cattr_accessor
原文地址:http://lee2013.iteye.com/blog/1098914 1. attr_accessor的用法相当简单, 就相当于getter和setter,看一个类就知道怎样用了: c ...