使用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:反向代理服务器

网络拓扑结构与下图基本类似,但是在实验过程中由于资源限制,我们减少了节点个数以及每个节点服务器的硬件配置。
image

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)下载安装文件
    image
    下载完成后,直接运行安装软件,选择默认设置:
    image
    选择本地安装目录,默认设置
    选择互联网的类型,默认设置
    选择依赖包的存储路径,默认设置
    选择依赖包的来源http://mirros.163.com
    选择安装哪些依赖包,本文中我们选择一个最大的默认类型Devel,安装类型为Install:
    image
    由于需要下载大量的依赖包文件,整个安装过程需要大约60分钟左右,甚至更长时间:

    如果安装过程中出现类似下面的错误提示,可以点击确定忽略,这个错误不影响后面的正常编译(笔者安装过程中出现了2次这个现象):

    经过近2小时的等待,终于安装完成了:
    image

  • 编译Windows版本的程序包

    • 从HAProxy官方网站下载编译所需的软件包,由于担心最新的版本有兼容性问题,笔者选择了2.0.27版本
    • 运行cygwin环境
    • 将下载的程序包放置到home/danzhang目录下
    • 解压缩文件
tar -zxvf haproxy-2.0.27.tar.gz
  • 进入解压缩的目录,编译Windows程序包
cd haproxy-2.0.27
make TARGET=cygwin
make install

编译过程大约10分钟左右,期间程序消耗大量的CPU资源:
image

  • 编译和安装完成后,我们可以在当前目录中发现新增的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请求:
image
当我们使用haproxy的IP地址去访问Azure DevOps Server,可以看到浏览器从其中一个应用节点(192.168.20.101)获取到了数据:
image

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 张洪君
在这里插入图片描述

posted on 2022-02-12 05:50  danzhang  阅读(244)  评论(0编辑  收藏  举报

导航