就是想讓node.js的程序跑在iis的意思,參考這篇文章《Hosting express node.js applications in IIS using iisnode》即可。
WCAT (WEB CAPACITY ANALYSIS TOOL)去了,我還以為講完了~~結果把網站一發布,跑不起來,發現需要手動編寫web.config來加入handler,OK,原生的node程序跑起來了。結果express下的網站又沒跑起來,最終解決后,串起來:
- 下載安裝node,需要注意的是,下的64位版的node是裝到64位的program files路徑下的,你需要下32位版的,或者直接下一個node.exe到32位program files目錄下,新建一個nodejs文件夾放進去;
- 下載安裝iisnode,此時如此你的c:\program files(x86)\nodejs\node.exe不存在的話它就會報錯退出了,這就是我第一步如此提示的原因,裝完后管理員權限執行安裝目錄下的setupsamples.bat可立即體驗下,沒必要;
- 下載安裝url rewrite包,express需要
- 將你的node網站發布到iis,比如:http://localhost:8081,應用程序池的.net版本任選,無意義
發布網站后做兩件事:
1,將監聽的端口改為:process.env.PORT,如在express下:app.set('port',process.env.PORT||3000);這樣即能保留iis端口又能讓node伺服網站的時候使用自定義的(如3000)端口;
2,在網站根目錄下添加web.config文件,加入如下內容:
<configuration>
<system.webServer>
<!-- indicates that the hello.js file is a node.js application
to be handled by the iisnode module -->
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" />
</handlers>
<!-- use URL rewriting to redirect the entire branch of the URL namespace
to app.js node.js application; for example, the following URLs will
all be handled by app.js:
http://localhost/foo
http://localhost/bar
-->
<rewrite>
<rules>
<rule name="main">
<match url="/*" />
<action type="Rewrite" url="app.js" />
</rule>
</rules>
</rewrite>
<!-- exclude node_modules directory and subdirectories from serving
by IIS since these are implementation details of node.js applications -->
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
這樣,所有/開頭的url都由app.js接管,app.js又被注冊成了一個http handler,使用iisnode模塊,這時候一個標准的express就可以正常跑起來了
最后,我還用了angular,正好試一下上述url rewrite會不會把angular的url路由也接管掉,實測不會,如果用angular或其它一些框架來做SPA(單頁應用)程序是沒問題的,原因應該是這些框架都是用切換hash的方式來路由,github那樣完全更改url的來不及測試,有時間加上測試結果
P.S. 上面介紹安裝配置過程的時候,講到安裝完iisnode后可立即體驗一下的那個bat程序可以不干,其實還是建議執行一下的,它會在默認網站下生成一個node虛擬路徑,里面有比較豐富的示例和說明,特別是上述web.config文件,里面還有很多可配置的地方,在configuration/readme.htm文件里面有詳細的描述,建議執行和詳閱。
P.S.P.S 某次重裝電腦(win8.1)后我又對着自己的文檔來干這事,結果卻碰到了http error 5500.19,錯誤代碼:0x80070021,描述:This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false".結果發現這不是問題,我自己的iis沒配置好罷了,從添加刪除功能里面,把CGI勾上即可:http://stackoverflow.com/questions/9794985/iis-this-configuration-section-cannot-be-used-at-this-path-configuration-lock
