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

  • 相关阅读:
    Anglarjs 工具方法
    AngularJs $scope 里面的$apply 方法和$watch方法
    CentOS 下tomcat安装
    Phonegap Android 项目使用Cordova
    Phonegap 原生控件(Android)与html混合
    Phonegap 通信原理
    Phonegap 开发环境搭建
    Phonegap 通知 Notification
    Phonegap 工作原理
    Angularjs MVC
  • 原文地址:https://www.cnblogs.com/danzhang/p/15885369.html
Copyright © 2020-2023  润新知