记录下使用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 撸一遍 ...
随机推荐
- (转)CentOS7使用ACL精确控制文件和目录的访问权限
原文:https://www.linuxidc.com/Linux/2018-01/150111.htm https://blog.csdn.net/maxiaoqiang1/article/deta ...
- java 中break 和continue 的非常规用法
正常情况下,break只能断掉最近的循环.(比如二个嵌套的for循环中 ,第二个循环的break.不会中断第一个for循环) 问题是: 嵌套中 如果要断掉任意其中的循环怎么做? 答案是: 加一个lab ...
- Windows下PATH等环境变量详解
在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问题是:有的学习者能够按照提示 ...
- JavaScript位移运算多个大于号的使用方法
JavaScript中的无符号位移运算符是用三个大于号来表示的 计算方法 例 100>>>2 100的二进制是 01100100 向右移2位后为 00011001 最后结果为25 1 ...
- Android硬件抽象层(HAL)深入剖析(三)【转】
前面分析了android HAL层是如何搜索硬件模块的动态共享库的,其实就是在"system/lib/hw/"或者"/vendor/lib/hw/"这两个路径下 ...
- 代码阅读——十个C开源项目
1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连 ...
- Java虚拟机(二):JVM内存模型
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...
- fastText 安装
Windows: https://www.lfd.uci.edu/~gohlke/pythonlibs/#fasttext 下载需要的版本 然后:pip install 文件名
- InnoSetup打包时出现Interal error: CallSpawnServer: Unexpected response: $0.错误的解决办法
如果在使用Innosetup打包软件时,如果出现Interal error: CallSpawnServer: Unexpected response: $0.错误, 如下图: 可以查看 Innose ...
- Linux下安装了Xampp,但命令行使用不了MySQL
引用:http://www.2cto.com/database/201406/309521.html 刚安装好Xampp,使用localhost也能正常运行, phpMyAdimin也能正常登录 ...