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