负载均衡代理背后:如何知道我正在使用哪一个?

时间:2012-12-04 16:45:04

标签: proxy load-balancing

企业环境:在我和互联​​网之间,有一个负载均衡的代理。 MSIE连接设置指向proxypac文件,大致说明:

function FindProxyForURL(url, host)
{
if ((shExpMatch(host,"intranet1.corp")) || (shExpMatch(host,"intranet2.corp")))
    return "DIRECT";
else
    return "PROXY proxy1.corp:3128; PROXY proxy2.corp:3128";
}

我的问题:以编程方式,我如何确定我正在使用哪个代理?我在Windows上。

1 个答案:

答案 0 :(得分:3)

您的示例PAC文件配置为进行故障转移,而不是负载平衡 换句话说,您的IE将始终首先尝试通过“proxy1.corp”连接,然后如果失败,它将尝试通过“proxy2.corp”连接。
请注意,IE使用“自动代理结果缓存”,因为您可以阅读here

  

理论上,每次调用FindProxyForURL()函数   Web浏览器即将获取一个对象。在实践中,   但是,微软的Internet Explorer具有微软所说的内容   “自动代理结果缓存”。每当代理HTTP服务器(位于   使用对FindProxyForURL()函数的调用结果或   成功联系以获取对象APR缓存   已更新为包含该对。如果,即将到来   调用FindProxyForURL()函数,Internet Explorer找到主机   已经列在APR缓存中,它使用列出的代理HTTP服务器   在APR缓存条目中而不是调用FindProxyForURL()   再次为同一主机运行。 (APR缓存的目的是   尝试减少JavaScript函数的次数   要运行,从而减少获取对象的开销。)因为   Internet Explorer的APR缓存由主机名索引,这意味着   PAC脚本不可能可靠地产生多个不同的   除主机名外,还会根据URL的任何部分生成结果。它   例如,提供不同的代理配置是不可能的   根据单个主机上URL的路径部分。因为   Internet Explorer的APR缓存缓存代理HTTP服务器而不是缓存   FindProxyForURL()函数的完整结果,这意味着   从一个代理HTTP服务器回退到另一个不会发生   即使FindProxyForURL()函数返回了一个问题的事件   多个代理HTTP服务器的列表。Microsoft's KnowledgeBase article #271361    总结了这些问题,并介绍了如何关闭Internet Explorer的APR缓存。微软的Internet Explorer也可以缓存   有关“坏”代理HTTP服务器的信息,持续30分钟。这没有   直接影响PAC脚本,但它经常引起混淆   当人们设置代理HTTP服务器并创建PAC时   脚本同时出现,代理HTTP服务器出现问题,   导致它被缓存为“坏”30分钟,被误诊为   PAC脚本的问题。

如果要使用PAC文件进行负载平衡,请查看this page以获取一些示例 但是,即使您在两个代理“proxy1”和“proxy2”之间进行负载平衡,所使用的代理也可能在每个请求时发生更改;此外,如果您在任何时候有多个IE实例处于活动状态,您可能会遇到某些实例正在使用“proxy1”而其他实例正在使用“proxy2”的情况。
因此,要回答您的问题,一种解决方案可能是检查HTTP标头响应中的"via" field。 例如,请考虑以下HTML页面:

<!DOCTYPE html>
<html>
  <head>
    <title>Javascript Proxy Detection</title>
    <script language="javascript">
    function doRequest(url) {
      if (typeof XMLHttpRequest != 'undefined') {
        try {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.open("GET", url, true);
          xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
              document.myForm.txt.value = xmlhttp.getAllResponseHeaders();
            }
          }
          xmlhttp.send(null);
        } catch (e) {
          alert(e.message);
        }
      } else {
        alert('no XMLHttpRequest');
      }
    }
    </script>
  </head>
  <body>
    <form name="myForm">
      <textarea cols="50" rows="10" name="txt"></textarea><br />
      <input type="button" value="Test Proxy" onclick="doRequest(location.href)">
    </form>
  </body>
</html>

通过直接连接(无代理)请求此页面,然后单击“测试代理”按钮,您将获得此类输出:

Content-Encoding: gzip
Content-Length: 470
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
Content-Type: text/html
Accept-Ranges: bytes

通过代理请求同一页面(在我的案例中为Squid),您还将获得“via”字段:

Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 470
Content-Type: text/html
X-Cache: MISS from ****
X-Cache-Lookup: HIT from ****:3128
Via: 1.1 ****:3128 (squid/2.7.STABLE9)

因此,通过检查标题中“via”字段的存在,您应该能够确定:

  1. 如果您正在使用代理
  2. 使用的代理
  3. 进一步参考: