当用户数量达到一定级别(例如2千)以上,为保证TFS系统的持续服务,最大程度减少因系统宕机对研发团队的影响,系统管理员一般会考虑应用层和数据库层的高可用性方案。

在应用层的高可用性方案中,目前比较常见的是采用F5 (www.f5.com)设备,将TFS的多个节点服务器纳入统一调配方案中,在多节点之间协调请求资源,实现负载均衡分配;同时,当任一节点服务器出现故障时,F5系统会自动将终端用户的http请求转发给其他应用层服务器。

在F5环境中部署TFS系统时,按照F5系统的默认配置,F5转发给TFS系统的http数据包中的源IP地址为F5服务器的地址,而不是最终用户的真实IP地址,在IIS的日志中,你会看到所有的源IP地址为F5的地址,如下图:

Figure 1 – IIS Logs

这种配置,对于需要排查问题的时候,给系统管理员带来了极大的不便,系统管理员无法跟踪到用户的真实IP地址。

通过查阅F5资料https://devcentral.f5.com/articles/x-forwarded-for-log-filter-for-windows-servers,发现可以通过配置X-Forwarded-For的日志过滤,在http数据包中增加字段信息,记录终端用户的原始(真实)IP信息。

我们这里不记录如何在F5服务器端的配置X-Forwarded-For字段,只记录如何在TFS的应用层服务器上IIS日志中增加X-Forwarded-For字段。

在IIS中增加对应字段,首先要确保的IIS版本在8.5或更新的版本,支持增强的日志Enhanced Logging for IIS 8.5,https://www.iis.net/learn/get-started/whats-new-in-iis-85/enhanced-logging-for-iis85)功能,否则你还需要二外的配置(例如下载F5的ISAPI过滤器,http://devcentral.f5.com/downloads/codeshare/F5XForwardedFor.zip)。

下面已图示的方式介绍IIS中增加F5中传入的额外字段:

1. 已管理员身份打开IIS管理器

2. 在左侧窗口中选择Team Foundation Server站点,右侧窗口中选择日志按钮

3. 在日志页面中,选择“选择字段…”按钮,在弹出的窗口中点击“添加字段”,输入在F5中新增的字段“X-FORWARDED-FOR”,并保存设置。

4. IIS会在系统中新建一个以“_x”结尾的同名日志文件,文件中记录下了F5中传入的用户源IP地址

通过上面的设置,我们在IIS的日志文件中可以获得终端用户的真实IP,这对跟踪数据请求的来源和分析问题原因有非常大的帮助。

【常见问题】

1. 修改IIS配置以后,可能导致浏览器访问出现500错误,此时重启TFS Job Agent服务即可

2. 在TFS2013上可能出现用户权限错位的现象,即A用户登录成了B用户,需要清除服务器缓存,或者升级TFS系统到2015或2017.

--

http://www.cnblogs.com/danzhang/  ALM MVP 张洪君

-

TFS应用层服务器获取F5用户的真实IP地址(高可用性)的更多相关文章

  1. PHP获取用户的真实IP地址

    本文出至:新太潮流网络博客 PHP获取用户的真实IP地址,非代理IP function getClientIP(){ global $ip; if(getenv("HTTP_CLIENT_I ...

  2. 使用CDN后配置nginx自定义日志获取访问用户的真实IP

    问题描述:         新上线了一个项目,架构如下(简单画的理解就好): 问题是:负载前面加上CDN后负载这里无法获取客户的真实访问IP,只能过去到CDN的IP地址: 问题解决: 修改nginx日 ...

  3. 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  4. Java获取请求客户端的真实IP地址

    整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...

  5. 获得用户的真实IP地址

    /** * 获得用户的真实IP地址 * * @access public * @return string */if (!function_exists('get_real_ip')){ functi ...

  6. PHP获得用户的真实IP地址

    <?php /** * 获得用户的真实IP地址 * * @access public * @return string */ function real_ip() { static $reali ...

  7. 使用nginx反向代理时,如何正确获取到用户的真实ip

    在记录日志的的时候,获取用户的信息,比如用户的ip,浏览器等等信息是十分重要的. 但是在使用nginx反向代理的时候,可能经过转发无法获取到用户的真实的ip, 在此情况下需要配置nginx,让其在转发 ...

  8. 获取本地请求的真实IP地址

    1 /** 2 * 自定义访问对象工具类 3 * 4 * 获取对象的IP地址等信息 5 * 6 */ 7 public class CusAccessObjectUtil { 8 9 /** 10 * ...

  9. java 获取请求客户端的真实IP地址

    转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr();方法获取的IP地址是:127.0.0.1或192.16 ...

随机推荐

  1. 103041000997维护的是周批,按周合并后再考虑最小采购批量、舍入值、然后回写到SAP系统

    描述:103041000997维护的是周批量,但最终没有按周批量来回写数据. 业务逻辑如下: 1.净需求考虑数量按周汇总(也有按日.按3天,具体 要根据物料主数据维护来判断) 2.第1点的结果再加上安 ...

  2. java并发:Condition的应用

    Condition类可以使线程等待,也可以唤醒线程.Condition类的await方法和Object类的wait方法等效Condition类的signal方法和Object类的notify方法等效C ...

  3. np.hsplit()

    numpy.hsplit numpy.hsplit(ary, indices_or_sections)[source] Split an array into multiple sub-arrays ...

  4. 粘性Service

    粘性Service就是一种服务 把他删去他又会马上创建 原理是在这个服务中去开启线程不断检测此服务是否存在如果不存在,咋就会重新创建 import android.app.Activity; impo ...

  5. 给dede添加栏目图片和栏目描述

    有的时候我们希望调用栏目时把栏目的图片和描述调出来,但dede好像没有提供栏目图片这个功能,而栏目的描述也是给meta:Description使用的,不是很方便.   所以我们需要自已给dede添加图 ...

  6. discuz的css处理机制

    common/common.css 是一个通用的css文件. common/module.css 是某个功能模块使用的css文件.   module.css中,利用特殊语法: /** 标识 **/ c ...

  7. Python发送邮件不需要发件人密码认证

    #!/usr/bin/python # coding: UTF-8 import smtplib from email.mime.text import MIMEText receivers_list ...

  8. Java一个文件上传工具类

    /** * 文件上传 * * @author cary * @since 2012-12-19 下午2:22:12 */ public class FileUploader { static fina ...

  9. PhpStorm 2017 激活办法

    最新版PhpStorm 2017正式版改进了PHP 7支持,改进代码完成功能.PhpStorm 绝对是PHP开发最好的开发工具. phpstorm已经升级到2017.1,原注册码失效,2017.1.2 ...

  10. Java数据结构和算法(一)线性结构之单链表

    Java数据结构和算法(一)线性结构之单链表 prev current next -------------- -------------- -------------- | value | next ...