在IIS7中应用Application Request Routing配置反向代理的图文教程

在配置web服务器的时候,我们经常遇到这样的问题,由于某些原因,该服务器只能拥有一个公网IP,但是可能需要提供其他机器或者本机上其他webserver的服务器给访问者,同时又不希望使用其他端口,如果在linux下,常见的解决方案是使用nginx作为前端server,通过反向代理间接访问其他webserver.在IIS7之前,在windows上要实现该功能却不是一件容易的事情,但是在IIS7上,通过Application Request Routing模块,我们可以轻松实现反向代理.

软件的安装与下载 https://www..net/softs/629246.html

安装步骤

1. IIS的版本是7.5.7600.16385.

在IIS7中应用Application Request Routing配置反向代理的图文教程

2. 关闭相关服务.

net stop was /y

net stop wmsvc /y

在IIS7中应用Application Request Routing配置反向代理的图文教程

第二个服务没有开。

在IIS7中应用Application Request Routing配置反向代理的图文教程

3. 手动安装ARR的依赖项。

a) Web Farm Framework module version 1.1

b) External cache module version 1.0

c) URL Rewrite module version 2.0

4.安装ARR.version 3.0

在IIS7中应用Application Request Routing配置反向代理的图文教程

5.启动之前关闭的服务。

net start was

net start wmsvc

6.安装成功。

遇到的问题:

之前使用WebPI进行安装。他会自动安装ARR3.0 相关的依赖项。Server Farm可以正常展示,但是ARR3.0 没有安装成功。查看系统日志 显示:未能加载文件或程序集:

在IIS7中应用Application Request Routing配置反向代理的图文教程

解决办法:

将自动安装的 arr 以及他的依赖项全都卸载。再按照以上步骤进行手动安装。

在IIS7中应用Application Request Routing配置反向代理的图文教程

  本次测试配置的情况,简单起见,只在iis中测试,配置3个网站,第一个”LevenWeb”,使用80端口提供服务,第二个”levenblog”,下面运行着levenblog2.0.9,使用8080端口,第三个”phpweb”,下面有一个”test.php”的phpinfo页面(iis7 php配置本文不再详述),本机ip:192.168.1.8,为了测试,我们先进行域名绑定,也就是在leven.com.cn下新增3个子域名,域名绑定如下图所示:

在IIS7中应用Application Request Routing配置反向代理的图文教程

我们的目标如下:

  http://phpweb.leven.com.cn/ 访问phpweb站点,也就是http://localhost:8081/

  http://levenblog.leven.com.cn/ 访问levenblog站点,也就是http://localhost:8080/

  http://realblog.leven.com.cn/ 访问公网上的levenblog站点,也就是http://leven.com.cn/

  http://localhost/leven 访问levenblog站点,也就是http://leven.com.cn/

  首先前往http://www.iis.net/extensions/ApplicationRequestRouting下载Application Request Routing,然后安装,本次实践使用的是V2版.

  安装完毕之后,新建3个站点:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  然后找到ARR配置菜单:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  开启Proxy项:

在IIS7中应用Application Request Routing配置反向代理的图文教程

在IIS7中应用Application Request Routing配置反向代理的图文教程

  然后在levenweb站点下配置反向代理路由,配置可以使用UI界面或者直接修改web.config的模式,本次配置给出ui和config文件两种方式,个人更喜欢config配置文件模式.

在IIS7中应用Application Request Routing配置反向代理的图文教程

  进入该项,先配置第一项, http://phpweb.leven.com.cn/ 访问phpweb站点,也就是http://localhost:8081/,选择”Add Rules...”:

  然后选择”Blank Rule”

在IIS7中应用Application Request Routing配置反向代理的图文教程

  然后填写如下:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  图片看不清楚?请点击这里查看原图(大图)。

  该参数设置表面ARR将拦截所有请求

  继续在”Conditions”中选择”Add”:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  该设置表面只有HTTP_HOST为phpweb.leven.com.cn的URL才能通过该规则,如果您绑定了多个域名,可以根据多次增加或者通过正则表达式的|来间隔

  最后在下面的Action中配置代理路径:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  图片看不清楚?请点击这里查看原图(大图)。

  在这儿,{R:1}代表了MatchUrl中的第一个匹配括号

  同样配置的web.config文件如下:

复制代码 代码如下:

<rewrite>
  <rules>
    <rule name="phpweb">
      <match url="^(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^phpweb.leven.com.cn$" />
      </conditions>
      <action type="Rewrite" url="http://localhost:8081/{R:1}" />
    </rule>
  </rules>
</rewrite>


测试访问http://phpweb.leven.com.cn/test.php,结果如下:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  下面同样可以配置levenblog.leven.com.cn和realblog.leven.com.cn

  Ui界面配置不再说明,配置完成的web.config如下:

复制代码 代码如下:

<rewrite>
  <rules>
    <rule name="levenblog">
      <match url="^(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^levenblog.leven.com.cn$" />
      </conditions>
      <action type="Rewrite" url="http://localhost:8080/{R:1}" />
    </rule>
    <rule name="realblog">
      <match url="^(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^realblog.leven.com.cn$" />
      </conditions>
      <action type="Rewrite" url="http://leven.com.cn/{R:1}" />
    </rule>
    <rule name="phpweb">
      <match url="^(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^phpweb.leven.com.cn$" />
      </conditions>
      <action type="Rewrite" url="http://localhost:8081/{R:1}" />
    </rule>
  </rules>
</rewrite>


访问结果分别为:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  和

在IIS7中应用Application Request Routing配置反向代理的图文教程

  我们再添加最后一项,将http://localhost/leven 代理到 http://leven.com.cn/

复制代码 代码如下:

<rule name="leven.com.cn">
  <match url="^leven/(.*)" />
  <conditions>
    <add input="{HTTP_HOST}" pattern="^localhost$" />
  </conditions>
  <action type="Rewrite" url="http://leven.com.cn/{R:1}" />
</rule>


但是此时访问会出现问题,如下图:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  显然,出现了css丢失等情况,通过查看源码:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  可以看到css的路径有误,不仅如此,所有的img,a标签路径全部出现了错误,代理之后的地址是/leven/xxx的,但是源地址仍然是/xxx,因此我们还需要增加一个Outbound Rule

在IIS7中应用Application Request Routing配置反向代理的图文教程

  配置好的config文件如下:

复制代码 代码如下:

<outboundRules>
  <rule name="Add application prefix">
    <match filterByTags="A,Img,Script,Link" pattern="^/(.*)" />
    <conditions>
      <add input="{URL}" pattern="^/leven/.*" />
    </conditions>
    <action type="Rewrite" value="/leven/{R:1}" />
  </rule>
</outboundRules>


然后刷新:

在IIS7中应用Application Request Routing配置反向代理的图文教程

  可见路径正确.

  在使用了反向代理之后,编程上也有些地方需要注意了,在取客户端IP的时候,由于多了一层代理,直接是无法获取的,因此,我们需要开启

在IIS7中应用Application Request Routing配置反向代理的图文教程

  然后通过获取Header中的X-Forworded-For字段来取得客户端IP

  从测试来看,ARR是个非常有用的代理模块,能完全满足我们反向代理的需求,不仅如此,ARR还提供了UrlRewrite,ServerFarms,Cache等很多功能,很是值得我们挖掘.