node在IIS上運行的好處:
Tomasz的回答是我見過最棒的:
使用iisnode模塊在IIS中托管node.js應用程序來取代自托管node.exe進程的優勢在於:
· 進程管理。 Iisnode模式注重node.exe進程的長期管理,能夠更簡潔地改善整體可靠性。你無需實現用來運行,停止或者顯示進程的基礎工具。
· 多核服務器上的可擴展性。由於node.exe是一個單線進程,只可適用於單核CPU。而iisnode模塊允許每個應用中創建多個node.exe進程,並根據HTTP流量調整使其負載平衡。,從而充分可以發揮服務器CPU性能,無需額外的基礎代碼。
· 自動更新。Iisnode模塊保證了node.js應用隨時保持更新(比如,在腳本文件變更時就會更新),node.exe進程得到循環。舊版本的應用能正確地完成正在進行中的請求執行,而所有的新請求都會分派到應用的最新版本。
· 通過HTTP訪問日志。Iisnode模塊提供通過HTTP訪問node.exe進程中的輸出。(比如,由console.log調用生成的輸出)。這個功能是幫你調試在遠程服務器上的node.js應用程序問題的關鍵。
· 與其他內容類型相連。 Iisnode模塊與IIS相融,讓一個單一的web頁面能夠涵蓋許多內容類型。比如,一個單一的頁面可以包含一個node.js應用,統計HTML,JavaScript文件,PHP應用和ASP.NET應用。這就讓用戶能隨意挑選最適合的工具,並未已有應用完成遷移。
· 只需改變少部分node.js應用代碼。 Iisnode模塊支持最少的改動來托管現有HTTP node.js應用。你只需通過process.env.PORT環境變量把HTTP服務器列出的地址變為iisnode提供的地址就可以了。
融合管理體驗。 issnode模塊完全集成IIS配置系統,並使用相同的工具和機制,類似於IIS其它組件的配置和維護。
除了有利於iisnode模塊中特定的點,在IIS中托管node.js應用還能讓開發者從一系列IIS功能中獲益匪淺,包括:
- 端口共享(通過80多個端口托管多個HTTP應用)
- 安全(HTTPS,身份驗證和授權)
- URL 重寫
- 壓縮
- 緩存
- 日志
都非常有說服力,但在我看來,最有趣的要數一體化了。Iisnode模塊是一個合理的IIS模塊,就像ASP.NET和PHP一樣。這就意味着你可以在一個單一的網站上看到多種內容。正如上述:
比如,一個單一的頁站可以包含一個node.js應用,統計HTML,JavaScript文件,PHP應用和ASP.NET應用。
一些同仁們一聽到我說,你可以在同一個AppPool中使用ASP.NET WebForms和ASP.NET MVC就好像“混血兒”一樣,就會瘋狂起來。親愛的讀者,大家都沒有意識到IIS的強大和靈活性。當你插入像node一樣的新東西,但還是按舊方法來操作時,它仍然會延續所有包含的優點。
好吧,你說服我了,那我要怎么在Windows上運行node.js呢?
我假定你運行的是IIS7.
· 去 下載node.exe,放在 c:\node
· 去 下載iisnode.
· 解壓iisnode壓縮包,解壓到\inetpub\iisnode
· (只是我的建議,未必是最好的位置)
· 以管理員身份在命令行中運行install.bat。
Install.bat將會:
· 從你安裝的IIS中取消注冊已有的“iisnode”全局模塊,如果你已經注冊過的話。
· 在你的安裝的IIS中注冊iisnode為本地模塊
· 安裝“iisnode”模塊配置文件
· 從applicationHost.config中的system.webServer組移除現有“iisnode”部分
· 在applicationHost.config中的system.webServer組添加新的“iisnode”部分
· 如果有iisnode web應用,直接刪除
· 為IIS添加新的iisnode站點
沒有保證!要小心,你是在邊緣行走。記住,你只是在偶然看到的博客上看到這篇文章。
警告:我搞不清楚正確的AppPool和文件系統權限,所以我直接給了我本地AppPool“SYSTEM”的權限。這很糟糕,都是我的錯。我在iisnode GitHub上寫下了問題,等他們有回復時我會想辦法修復然后更新的。
我為node做了個新的AppPool,給了它SYSTEM的訪問權限,然后將Node Site分配給這個新的AppPool。你的站點看上去就是這樣的:
如果你在IIS7的這個頁面上點擊這個模塊,你將會看到iisnode是本地模塊:
現在,你可以點擊http://localhost/node/helloworld/hello.js 然后得到回饋:
Hello, world! [helloworld sample]
內容很簡單:
1: var http = require('http');
2:
3: http.createServer(function (req, res) {
4: res.writeHead(200, {'Content-Type': 'text/plain'});
5: res.end('Hello, world! [helloworld sample]');
6: }).listen(process.env.PORT);
很棒吧。
玩玩WCAT(Web容量分析工具)和node。
免責聲明:先說清楚,這只是玩玩。不過為了展示它的確能用,而且運行的速度很快。我做的不是基准內容,我也沒說過“這個運行起來比別的工具好”。記住,他們最近剛剛起步,把node遷移到Windows,Tomasz和他的朋友們最近才開始做。所以不要期望太高。話說回來,他們現在做成的內容已經很嘆為觀止了。
我真是有些激動了。我是說把一個新的東西安裝到另一個新的東西上,然后只運行一次就成功了。我做完一系列基礎工作之后,我想做一些簡單的壓力測試看看大家做了些什么。
首先,我安裝了WCAT,一款IIS團隊開發的免費Web容量分析工具。
1. WCAT 6.3 x86
2. WCAT 6.3 x64
警告:這是一個僅支持命令行的工具,運行起來真的有點小家子氣。有點混亂,設置安裝也花了我點時間。以下是我安裝的步驟。都是從管理者權限的命令提示符中執行的。注意我是在同一台機器上做的,記住這是GOM 。
1. cscript //H:Cscript
2. wcat.wsf –terminate –update –clients localhost
3. 然后我建了一個文件夾命名為\nodetests,然后把這三個文件放了進去。
wcat.bat
pushd C:\Users\Scott\Desktop\nodetests
"c:\program files\wcat\wcat.wsf" -terminate -run -clients localhost -f settings.ubr -t nodescenario.ubr -s localhost -singleip -o C:\Users\Scott\Desktop\nodetests
pause
nodescenario.ubr (你可以隨意命名)
這也很簡單。它會被4個示例程序一一調用。
1: scenario
2: {
3: name = "node_fun";
4:
5: warmup = 30;
6: duration = 90;
7: cooldown = 30;
8:
9: default
10:
11: setheader
12: {
13: name = "Connection";
14: value = "keep-alive";
15: }
16: setheader
17: {
18: name = "Host";
19: value = server();
20: }
21: version = HTTP11;
22: statuscode = 200;
23: close = ka;
24: }
25:
26: transaction
27: {
28: id = "foo";
29: weight = 1000;
30: request
31: {
32: url = "/node/logging/hello.js";
33: }
34: }
35: transaction
36: {
37: id = "bar";
38: weight = 2000;
39: request
40: {
41: url = "/node/helloworld/hello.js";
42: }
43: }
44: transaction
45: {
46: id = "baz";
47: weight = 2000;
48: request
49: {
50: url = "/node/defaultdocument/";
51: }
52: }
53: transaction
54: {
55: id = "bat";
56: weight = 2000;
57: request
58: {
59: url = "/node/configuration/hello.js";
60: }
61: }
62: }
settings.ubr
我從別的例子中復制過來並去掉注釋然后進行了一點修改(在測試過程中修改的):
1: server = "hexpower7";
2: clients = 1;
3: virtualclients = 8;
現在,運行以測試
然后,我以管理者身份運行wcat.bat。你會看到node.exe開始行動。
(記得他們是以SYSTEM運行的,因為我搞不清正確的權限,是我的錯。我總有一天會搞清楚的。)
這是WCAT工具的控制台輸出。我可以連續在一秒內做一萬個HelloWorld,這最終會是上百萬個正常請求並且在90秒內得到回應。那可是很多個HelloWorld。
記住Hanselman的運行法則。
“什么都不做,那就有無限的可能”—我
當然,這些都是在一台配置不錯的機器的本地操作。這不過是個HelloWorld(外加一些日志),所以沒有太多的測試node和IIS,不過倒是測試了整個系統,IIS,iisnode和node本身的合作互動。
另:ASP.NET IhttpHandler在同台機器上做同樣的事情,結果是在一秒內有22500個請求,所以node和iisnode還有上升空間,這是個好消息。
以下是node/iisnode的結果:
還有很多東西我可以配置在兩個站點上,客戶數量,虛擬客戶,還有iisnode特定設置(都在web.config中管理):
1: <configuration>
2: <system.webServer>
3: <handlers>
4: <add name="iisnode" path="hello.js" verb="*" modules="iisnode" />
5: </handlers>
6: <iisnode
7: nodeProcessCommandLine="%systemdrive%\node\node.exe"
8: maxProcessCountPerApplication="4"
9: maxConcurrentRequestsPerProcess="1024"
10: maxPendingRequestsPerApplication="1024"
11: maxNamedPipeConnectionRetry="3"
12: namedPipeConnectionRetryDelay="2000"
13: asyncCompletionThreadCount="4"
14: initialRequestBufferSize="4096"
15: maxRequestBufferSize="65536"
16: uncFileChangesPollingInterval="5000"
17: gracefulShutdownTimeout="60000"
18: loggingEnabled="true"
19: logDirectoryNameSuffix="logs"
20: maxLogFileSizeInKB="128"
21: appendToExistingLog="false"
22: />
23: </system.webServer>
24: </configuration>