记录下使用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以上,抓住了青春的尾巴。

记录下使用iis7代理node.js写的网站程序

再就是安装iisnode了,iisnode代码托管在github上,这里也提供了稳定发布版的二进制文件了,懒得自己编译了就直接下载合适的版本了记录下使用iis7代理node.js写的网站程序

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

上一篇:Mac下U盘安装系统“未验证的错误”


下一篇:nmap参数原理抓包分析