使用HAProxy实现Azure DevOps Server负载均衡(反向代理)
Contents
- 1. 概述
- 2. 环境部署
- 2.1 HAProxy环境部署
- 2.2 配置和运行HAProxy
- 2.3 验证效果
- 3. 已知问题
1. 概述
最近在一个Azure DevOps Server的项目实施过程中,由于客户企业内网执行严格的安全管理规范,不允许直接将Azure DevOps Server的服务器暴露给用户端(路由映射也被禁止),需要在用户与服务器之间架设代理服务器转发通信数据包,以便通过企业的信息安全等级保护测评。
在客户的网络拓扑结构中,目前使用非常流行的Nginx作为反向代理软件,为业务系统和管理软件提供代理服务;但是Azure DevOps Server使用Windows域作为认证服务器,采用了NTLM的方式实现用户认证,而开源版本的Nginx恰恰不支持NTLM,只有收费版本Nginx Plus支持NTLM,因此基本就放弃了Nginx的方案。在之前的项目实践中,有许多客户使用硬件设备来实现负载均衡和反向代理,例如F5或Citrix NetScaler,但是这样的硬件设备采购已经远远超出了项目预算成本,因此也被排除出可行方案。
最后通过调研,我们转向技术比较成熟的HAProxy。HAProxy是一个使用C语言编写的自由及开放源代码软件,原理或功能与Nginx都比较类似,它提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。并且,HAProxy原生支持NTLM认证,这是我们选择它的最关键原因。本文后续的内容,主要介绍在Windows环境中,如何使用HAProxy,搭建一套支持网络负载均衡与反向代理的Azure DevOps Server环境。
在下面的示例中,为了简化系统部署,我们在测试环境中使用了下面几台服务器:
- 用户认证服务器:Active Directory
- Azure DevOps Server 2020,同时部署了数据库服务器
- HAProxy 2.0.27:反向代理服务器
网络拓扑结构与下图基本类似,但是在实验过程中由于资源限制,我们减少了节点个数以及每个节点服务器的硬件配置。
2. 环境部署
由于本文的主要内容是介绍如何部署负载君和反向代理环境,在本文在部署过程中,我们省略了Azure DevOps Server的部署过程;如果需要了解Azure DevOps Server的部署,可以参考博客《Azure DevOps Server 2020.1 升级指南 (TFS) 》https://www.cnblogs.com/danzhang/p/14458178.html。
2.1 HAProxy环境部署
在Linux服务器上安装HAProxy,是一件比较容易的事情,搭建过程可以参考文档《Install HAProxy on Ubuntu》https://www.haproxy.com/blog/how-to-install-haproxy-on-ubuntu/;由于Azure DevOps Server基本都使用Windows的操作系统,本文重点介绍如何在Windows服务器上安装HAProxy,并配置负载均衡和反向代理。
在Windows上运行HAProxy,没有可以直接下载的软件包,需要用户首先下载源代码,并使用cygwin环境编译出Windows版本的运行文件exe。下面来看一下整个编译的过程:
安装cygwin
从cygwin官网(https://www.cygwin.com/install.html)下载安装文件
下载完成后,直接运行安装软件,选择默认设置:
选择本地安装目录,默认设置
选择互联网的类型,默认设置
选择依赖包的存储路径,默认设置
选择依赖包的来源http://mirros.163.com
选择安装哪些依赖包,本文中我们选择一个最大的默认类型Devel,安装类型为Install:
由于需要下载大量的依赖包文件,整个安装过程需要大约60分钟左右,甚至更长时间:
如果安装过程中出现类似下面的错误提示,可以点击确定忽略,这个错误不影响后面的正常编译(笔者安装过程中出现了2次这个现象):
经过近2小时的等待,终于安装完成了:编译Windows版本的程序包
- 从HAProxy官方网站下载编译所需的软件包,由于担心最新的版本有兼容性问题,笔者选择了2.0.27版本
- 运行cygwin环境
- 将下载的程序包放置到home/danzhang目录下
- 解压缩文件
- 从HAProxy官方网站下载编译所需的软件包,由于担心最新的版本有兼容性问题,笔者选择了2.0.27版本
tar -zxvf haproxy-2.0.27.tar.gz
- 进入解压缩的目录,编译Windows程序包
cd haproxy-2.0.27 make TARGET=cygwin make install
- 编译和安装完成后,我们可以在当前目录中发现新增的Windows执行程序haproxy.exe
2.2 配置和运行HAProxy
- 当完成上面的编译程序包后,我们将对应的文件复制到运行代理服务器的计算机中,需要复制的文件包含:
- haproxy.exe:10MB
- cygwin1.dll:3.5MB
- cyggcc_s-1.dll:110KB
- 创建一个配置文件,文件名为haproxy.cfg,内容如下,并注意文件的编码格式为ANSI:
#haproxy 配置示例 global maxconn 15000 nbproc 1 daemon defaults mode tcp retries 3 option abortonclose maxconn 32000 timeout connect 300000ms timeout client 300000ms timeout server 300000ms log 127.0.0.1 local0 err listen tfs bind *:80 mode http server s1 192.168.20.101:80 weight 1 rise 2 fall 3 server s1 192.168.20.102:80 weight 1 rise 2 fall 3 listen status bind *:900 mode http stats refresh 30s stats uri / stats auth admin:admin stats admin if TRUE
- 还可以自己创建个批处理文件run.bat,以便快速启动haproxy,文件的内容为:
haproxy.exe -f haproxy.cfg -d
2.3 验证效果
一切就绪后,我们在命令行窗口中,使用run.bat运维haproxy.exe,系统提示haproxy已经开始侦听http请求:
当我们使用haproxy的IP地址去访问Azure DevOps Server,可以看到浏览器从其中一个应用节点(192.168.20.101)获取到了数据:
3. 已知问题
如果HAProxy的侦听端口与Azure DevOps Server的发布端口不一致,会出现页面跳转到Azure DevOps Server服务器的现象;如果用户不能直接访问服务器,就会出现异常。
例如,如果haproxy的端口为8080,而DevOps Server的端口为80,当用户访问这个地址(http://192.168.20.100:8080 ),系统会自动跳转到了http://192.168.20.101/defaultcollection;如果用户的Url中携带了团队项目集合名称,例如http://192.168.20.100:8080/defaultcollection,系统则是正常的。
这个问题应该与DevOps Server的根路径自动跳转到最近的团队项目集合(默认集合)有关系,但是目前还没有找到解决方案。
如果需要,你还可以从微软Azure DevOps Server 的在线文档,查询更多的权威资料,也欢迎通过下面的联系方式与我沟通,相互学习,相互提高!
https://www.cnblogs.com/danzhang
Azure DevOps MVP 张洪君