昨天晚上一个学弟的紧急求救,说了本身接的单子作了一个网站,使用了本身熟悉的技术——node.js+mongdb,但当看到部署环境惊呆了,是 windows+sqlserver。这些都不是关键,关键是服务器已经用iis7跑了不少网站,很明显80端口已经被占用了,瞬间只能拍大腿了。php
当听完他的描述后,微微一笑,安慰他说,你应该庆幸你是用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写的网站。html
起初我想着很简单啊,以前本身有试着部署node写的一个轻博客平台-ghost,都是用一个web服务器去代理,我使用的是nginx,稍微配置下既可 以绑定域名,又能够将其转发到node网站所使用的端口。我服务器全部的web服务都是经过nginx来代理的,好比nginx转发请求到tomcat, 不只如此还能够作负载均衡,此外经过php-fpm连接php程序,固然代理node网站程序也是垂手可得。不得不说nginx是个极其优秀的web服务 程序,一直想花点时间阅读其源代码,能够玩性过重,一到假日就懒虫泛滥。node
可是问题没那么简单,若是可使用这么好的nginx工具,也不会有文题提到的iis了。这是由于服务器已经跑了不少老网站了,人家运行的好好的啊,那 80端口只有一个,被他占用了怎么办。固然可使用nginx转发全部请求,也就是将nginx做为web服务器的门户使用80端口,全部通过80端口的 web访问都经过nginx转发,经过配置能够将对应主机头的访问转发到对应的iis上去。但这工做量大,并且有脱裤子放屁的嫌疑,由于已经有一个iis 做为网站服务了,想来想去只能拿iis开刀了。linux
要在iis部署node,我想须要解决两个问题,第一个是打开iis的rewrite功能,第二个让iis与node要创建联系。我在Google打入iis部署node程序,很快出现了我想要的结果,我发现这么一个好东西IISnode,网站https://github.com/WindowsAzure/iisnode, 它实现的是一个IIS Module,全局加载到IIS中之后,就能够在任意一个站点中,经过Web.config来指定把某些路径转交给node程序来解释执行,同时能够配置 一些额外参数,好比启动多少个nodejs进程,每一个进程最大容许多少个链接,容许多少个等待中的链接等等。并且这个module自己还有监视站点文件变 化的功能,当你修改了某个js文件,它能够自动重启加载。nginx
如今简单将过程帖一下吧:git
首先安装node,这个太简单了,windows提供的node包甚至直接省去了环境变量的设置,故自行google之 http://nodejs.org/github
再安装IIS的URL Rewrite模块,http://www.iis.net/downloads/microsoft/url-rewrite.打开链接捏一把冷汗,支持的iis版本是7以上,抓住了青春的尾巴。web
再就是安装iisnode了,iisnode代码托管在github上,这里也提供了稳定发布版的二进制文件了,懒得本身编译了就直接下载合适的版本了sql
https://github.com/tjanczuk/iisnode/releases/download/v0.2.11/iisnode-full-v0.2.11-x64.msiwindows
各软件的安装过程,直接跳过,最关键的一步仍是配置,我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