如果你有一台安装了windows server的服务器,并且使用了iis来作为web服务器,而此时此刻你正在为如何用iis来托管你的nodejs网站发愁,那么这篇教程就是为你量身定制了。把nodejs站点部署到iis上其实是非常简单的,关键是部署后的配置可能会稍微繁琐一点。
一、在iis上部署nodejs站点
首先,你需要到node官网下载node程序并安装之,安装步骤比较简单,基本就是一路点击下一步直至完成,这里不再赘述。
其次,需要安装iis的urlrewrite模块,下载地址在这里:https://www.iis.net/downloads/microsoft/url-rewrite。
最后,安装iisnode模块,下载地址:https://github.com/Azure/iisnode/releases,选择合适的版本下载安装。
前面的环境搭建好之后,就可以在iis上添加你的nodejs网站了。
二、iisnode的配置详解
你需要在网站根目录下新建web.config文件并进行配置,详细的配置及说面如下:
<configuration>
<system.webServer>
<!-- 标示koajs/app.js是一个要被iisnode模块处理的nodejs应用 -->
<handlers>
<add name="iisnode" path="koajs/app.js" verb="*" modules="iisnode" />
</handlers>
<!-- 将match节点(如果没有则匹配所有的url)匹配到的url交给koajs/app.js处理,例如:
http://localhost/hello/foo
http://localhost/hello/bar
-->
<rewrite>
<rules>
<rule name="app">
<!-- <match url="hello/*" /> -->
<action type="Rewrite" url="koajs/app.js" />
</rule>
</rules>
</rewrite>
<!-- 排除node_modules文件夹及其子文件夹 -->
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
<!-- 返回自定义错误:https://github.com/tjanczuk/iisnode/issues/476 -->
<httpErrors existingResponse="PassThrough" />
<!-- node_env - 设置process.evn.NODE_ENV (production, development, staging, ...)
enableXFF - 配置iisnode添加或修改携带远程主机的ip地址的X-Forwarded-For请求头 -->
<iisnode node_env="production" enableXFF="true" />
</system.webServer>
</configuration>
- <configuration>
- <system.webServer>
- <!-- 标示koajs/app.js是一个要被iisnode模块处理的nodejs应用 -->
- <handlers>
- <add name="iisnode" path="koajs/app.js" verb="*" modules="iisnode" />
- </handlers>
- <!-- 将match节点(如果没有则匹配所有的url)匹配到的url交给koajs/app.js处理,例如:
- http://localhost/hello/foo
- http://localhost/hello/bar
- -->
- <rewrite>
- <rules>
- <rule name="app">
- <!-- <match url="hello/*" /> -->
- <action type="Rewrite" url="koajs/app.js" />
- </rule>
- </rules>
- </rewrite>
- <!-- 排除node_modules文件夹及其子文件夹 -->
- <security>
- <requestFiltering>
- <hiddenSegments>
- <add segment="node_modules" />
- </hiddenSegments>
- </requestFiltering>
- </security>
- <!-- 返回自定义错误:https://github.com/tjanczuk/iisnode/issues/476 -->
- <httpErrors existingResponse="PassThrough" />
- <!-- node_env - 设置process.evn.NODE_ENV (production, development, staging, ...)
- enableXFF - 配置iisnode添加或修改携带远程主机的ip地址的X-Forwarded-For请求头 -->
- <iisnode node_env="production" enableXFF="true" />
- </system.webServer>
- </configuration>
<configuration>
<system.webServer>
<!-- 标示koajs/app.js是一个要被iisnode模块处理的nodejs应用 -->
<handlers>
<add name="iisnode" path="koajs/app.js" verb="*" modules="iisnode" />
</handlers>
<!-- 将match节点(如果没有则匹配所有的url)匹配到的url交给koajs/app.js处理,例如:
http://localhost/hello/foo
http://localhost/hello/bar
-->
<rewrite>
<rules>
<rule name="app">
<!-- <match url="hello/*" /> -->
<action type="Rewrite" url="koajs/app.js" />
</rule>
</rules>
</rewrite>
<!-- 排除node_modules文件夹及其子文件夹 -->
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
<!-- 返回自定义错误:https://github.com/tjanczuk/iisnode/issues/476 -->
<httpErrors existingResponse="PassThrough" />
<!-- node_env - 设置process.evn.NODE_ENV (production, development, staging, ...)
enableXFF - 配置iisnode添加或修改携带远程主机的ip地址的X-Forwarded-For请求头 -->
<iisnode node_env="production" enableXFF="true" />
</system.webServer>
</configuration>
另外,如果你使用的是koa框架,并且部署在iis上,你想通过ctx.ip获取ip地址,那么你需要设置app.proxy = true,具体设置代码如下
const Koa = require('koa');
const app = new Koa();
app.proxy = true;
......
- const Koa = require('koa');
- const app = new Koa();
- app.proxy = true;
- ......
const Koa = require('koa');
const app = new Koa();
app.proxy = true;
......
还有一种方法是,自己直接通过“X-Forwarded-For”请求头获取ip地址:ctx.get(“X-Forwarded-For”)。