記錄下使用iis7代理node.js寫的網站程序

   昨天晚上一個學弟的緊急求救,說了本身接的單子作了一個網站,使用了本身熟悉的技術——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

QQ截圖20150808172305

再就是安裝iisnode了,iisnode代碼託管在github上,這裏也提供了穩定發佈版的二進制文件了,懶得本身編譯了就直接下載合適的版本了QQ截圖20150808172719sql

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

相關文章
相關標籤/搜索