HAProxyのインストールと構成の詳細な説明

1. ハプロキシの概要

  HAProxy は、フランス人の Willy Tarreau によって開発されたオープン ソース ソフトウェアで、10,000 を超えるクライアントの同時接続を処理できる高性能 TCP および HTTP ロード バランサです。Cookie ベースの永続性、コンテンツ ベースのスイッチング、過負荷保護のための高度なトラフィック ポリシング、自動フェイルオーバー、ランタイムの正規表現ベースのヘッダー制御、Web ベースのレポート、アプリケーションやネットワークのトラブルシューティングに役立つ高度なログ、およびその他の機能を提供する機能が提供されています。 。
  HAProxy は、高可用性、負荷分散、TCP および HTTP アプリケーションのプロキシを提供し、仮想ホストをサポートします。無料で高速かつ信頼性の高い負荷分散ソリューションです。HAProxy は、通常セッションの永続性やレイヤー 7 処理を必要とする、負荷の高い Web サイトに特に適しています。HAProxy は現在のハードウェアで実行され、数万の同時接続をサポートできます。また、その動作モードにより、Web サーバーがインターネットに公開されないように保護しながら、現在のアーキテクチャに簡単かつ安全に統合できます。

公式サイト: https: //www.haproxy.com/

1. LVS、Haproxy、Nginx の違い

  1. LVS は Linux オペレーティング システムに基づいてソフト ロード バランシングを実装し、Haproxy と Nginx はサードパーティ アプリケーションに基づいてソフト ロード バランシングを実装します。
  2. LVS は、レイヤー 4 を実装できる IP ロード バランシング テクノロジですが、ディレクトリや URL に基づく転送は実装できません。Haproxy と Nginx はどちらもレイヤー 4 およびレイヤー 7 テクノロジーを実装でき、Haproxy は TCP および HTTP アプリケーションに包括的な負荷分散ソリューションを提供できます。
  3. LVS は ISO モデルの第 4 層で動作するため、そのステータス監視機能は単一ですが、Haproxy はより豊富で強力なステータス監視機能を備えており、ポート、URL、スクリプトなどの複数のステータス監視方法をサポートできます。
  4. Haproxy は強力ですが、全体的なパフォーマンスはレイヤー 4 モードの LVS ロード バランシングよりも低くなります。
  5. Nginxは主にWebサーバーやキャッシュサーバーとして使用されます
  6. Haproxy は仮想ホストもサポートします
  7. Haproxy は 8 つのロード バランサー戦略をサポートします
  8. Haproxy の利点は、セッション保持、Cookie ガイダンスのサポート、指定された URL の取得によるバックエンド サーバーのステータスの検出のサポートなど、nginx の欠点の一部を補うことができます。
  9. Haproxy は LVS に似ており、単なる負荷分散ソフトウェアですが、効率の点では、負荷分散速度が Nginx より優れており、同時処理の点でも Nginx より優れています。
  10. Haproxy は TCP プロトコルのロード バランシング転送をサポートします

1 枚の図は比較をまとめたもの
で、Nginx、LVS、HAProxy の 3 つの負荷分散ソフトウェアの長所と短所、適用性、規模の観点から詳細に比較しています。
ここに画像の説明を挿入します

2. HAProxy の機能と利点:

  1. 独自SSLをサポートし、クライアントSSLとサーバーSSLの両方をサポートします。
  2. IPv6 および UNIX ソケットをサポート
  3. HTTP キープアライブのサポート
  4. HTTP/1.1圧縮をサポートして帯域幅を節約
  5. 最適化された正常性検出メカニズム (SSL、スクリプト化された TCP、チェック エージェントなど) をサポートします。
  6. レイヤ 7 負荷分散をサポートします。
  7. 信頼性と安定性は非常に優れています。
  8. 同時接続数は40,000~50,000、単位時間あたりの最大リクエスト処理数は20,000、最大データ処理速度は10Gbpsです。
  9. 8 つの負荷分散アルゴリズムをサポートし、セッション保持をサポートします。
  10. 仮想ホスティングをサポートします。
  11. 接続拒否と完全に透過的なプロキシをサポートします。
  12. サーバーステータス監視ページがあります。
  13. ACLをサポートします。

3. HAProxy がセッションを維持するための 3 つのソリューション

HAProxy は、同じクライアントがサーバーにアクセスできるようにセッションを維持します。解決策としては、クライアント IP、Cookie、セッションの 3 つがあります。

  1. ハッシュはクライアント IP を通じて計算され保存され、同じ IP がプロキシ サーバーにアクセスするときに固定実サーバーに転送できるようになります。
  2. セッション維持のため、実サーバーに依存してクライアントの Cookie 情報を送信します。
  3. セッションの永続性を実現するために、実サーバーのセッションとサーバー ID が保存されます。(HAProxy では、バックエンド サーバーがネットワークに接続できることのみが必要であり、LVS のような面倒な ARP 構成は必要ありません)

4. HAProxy のバランス 8 負荷分散アルゴリズム:

  1. roundrobin: 加重ラウンドロビンに基づきます。
  2. static-rr: 加重ラウンドロビンに基づきます。静的アルゴリズム、実行時の変更は有効になりません
  3. source:リクエスト元IPに基づくアルゴリズム。リクエストの送信元 IP に対してハッシュ操作を実行し、その結果をバックエンド サーバーの合計の重みで割って、一致するサーバーに転送します。同じ IP からのクライアント要求を常に特定のバックエンド サーバーに転送できるようにします。
  4. leastconn: 最小限の接続。(データベースの負荷分散に適していますが、セッションが短い環境には適していません)
  5. uri: URI の一部または全体に対してハッシュ操作を実行し、それをサーバーの合計の重みで割って、最後に一致するバックエンドに転送します。
  6. uri_param: バックエンド サーバーの数が変わらない場合でも、同じユーザー リクエストが同じマシンに確実に配信されるように、URL パスのパラメーターに従って転送します。
  7. hdr(<name>): http ヘッダーが存在しない場合は、http ヘッダーに基づいて転送します。次に、単純なラウンドロビンを使用します。

5. HAProxy のメイン動作モード

  • TCP モード: クライアントとサーバーの間に全二重接続が確立され、シンプル モードではレイヤー 7 メッセージの処理は実行されません。
    通常、SSL、SSH、SMTP、およびその他のアプリケーション層で使用されます。
  • http モード (一般的な使用): クライアントのリクエストはバックエンド サーバーに転送される前に詳細に分析され、RFC 形式と互換性のないリクエストはすべて拒否されます。

2. HAProxyのインストール

インストールには 2 つの方法があり、コンパイルとデプロイメントに比べて、tar.gz パッケージと yum メソッドは、yum を介してインストールする方が簡単で便利です。

1.HAProxyバージョンの説明

この記事では、CentOS 7 に HAProxy をすばやくインストールする方法を説明します。
ただし、CentOS の yum ソースのデフォルトの haproxy バージョンが比較的低いという欠点があります。

システムにインストールできる haproxy のバージョンを見ると、1.5.18 であることがわかります。

yum list haproxy

[root@localhost ~]# yum list haproxy
已加载插件:fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
 * base: mirrors.bupt.edu.cn
 * extras: mirrors.bupt.edu.cn
 * updates: mirrors.huaweicloud.com
可安装的软件包
haproxy.x86_64                                                                          1.5.18-9.el7_9.1                                                                           update

最新の haproxy をインストールしたい場合はどうすればよいでしょうか?

方法 1: rpm パッケージのインストール プロセス (推奨)


HAPROXY は、rpm 関連のパッケージを公式に提供していません。サードパーティ ウェアハウスの rpm パッケージを通じて、サードパーティの Web サイトから rpm パッケージをダウンロードできます: https://pkgs.org/download/haproxy
。対応するバージョンを選択します。デモは CentOS7 上で行われます。 9 新しいバージョンの haproxy 2.2 をインストールします。

  1. システムの haproxy のバージョンを確認します yum: yum info haproxy
    CentOS7 のバージョン情報は 1.5.18 ですが、まだ非常に古いバージョンです。

    #CentOS7 上的版本信息 1.5.18  版本还是很老的了,我们在这个CentOS7.9 上演示编译安装最新版本的HAPROXY
    [root@localhost ~]# yum info haproxy
    已加载插件:fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.huaweicloud.com
     * extras: mirrors.huaweicloud.com
     * updates: mirrors.huaweicloud.com
    可安装的软件包
    名称    :haproxy
    架构    :x86_64
    版本    :1.5.18
    发布    :9.el7_9.1
    大小    :835 k
    源    :updates/7/x86_64
    简介    : TCP/HTTP proxy and load balancer for high availability environments
    网址    :http://www.haproxy.org/
    协议    : GPLv2+
    描述    : HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high
    
  2. リポジトリ情報ファイルをダウンロードするwget https://repo.ius.io/ius-release-el7.rpm

    [root@localhost ~]# wget https://repo.ius.io/ius-release-el7.rpm
    --2023-03-16 14:35:48--  https://repo.ius.io/ius-release-el7.rpm
    正在解析主机 repo.ius.io (repo.ius.io)... 104.85.67.135, 2600:140b:5000:98d::3898, 2600:140b:5000:982::3898
    正在连接 repo.ius.io (repo.ius.io)|104.85.67.135|:443... 已连接。
    已发出 HTTP 请求,正在等待回应... 200 OK
    长度:8412 (8.2K) [application/x-rpm]
    正在保存至: “ius-release-el7.rpm”
    100%[================================================================================================================================================>] 8,412       --.-K/s 用时 0s     
    [root@localhost ~]# ll
    -rw-r--r--. 1 root root    8412 13 14:05 ius-release-el7.rpm
    
  3. epel-releaseをインストールするyum -y install epel-release

  4. ius-release-el7.rpm をインストールするrpm -Uvh ius-release*rpm

  5. haproxy バージョン 2.2 をインストールするyum install haproxy22

  6. ハプロキシを開始するsystemctl start haproxy

# 安装 haproxy 2.2.22版
[root@localhost ~]# yum install haproxy22
# 查看端口监听 看不到有  haproxy 相关的
[root@localhost ~]# ss -tlnp | grep haproxy   

# 启动服务,再查看端口监听
[root@localhost ~]# systemctl start haproxy
[root@localhost ~]# ss -tlnp | grep haproxy   
LISTEN     0      128          *:5000                     *:*                   users:(("haproxy",pid=1416,fd=7))

# 查看版本
[root@localhost ~]# haproxy -v
HA-Proxy version 2.2.29-c5b927c 2023/02/14 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.2.29.html
Running on: Linux 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64
# 查看生成的文件   
[root@localhost ~]# rpm -ql haproxy22    
/etc/haproxy     					#haproxy 主要目录之一
/etc/haproxy/haproxy.cfg			#此文件是配置文件,很重要
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/lib/systemd/system/haproxy.service		#haproxy 启动文件
/usr/sbin/haproxy
/usr/share/doc/haproxy22-2.2.29
/usr/share/doc/haproxy22-2.2.29/51Degrees-device-detection.txt
………

方法 2: IUS のインストール プロセス

IUS は、RHEL および CentOS 用の選択されたソフトウェアの新しいバージョンを提供する yum リポジトリです。

RHEL による CentOS 用の最新ソフトウェア バージョンの yum ソースを提供します。

  1. IUS yum ソースを構成します。vim /etc/yum.repos.d/ius-7.repo

    [ius]
    name = IUS for Enterprise Linux 7 - $basearch
    baseurl = https://repo.ius.io/7/$basearch/
    enabled = 1
    repo_gpgcheck = 0
    gpgcheck = 1
    gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7
    [ius-debuginfo]
    name = IUS for Enterprise Linux 7 - $basearch - Debug
    baseurl = https://repo.ius.io/7/$basearch/debug/
    enabled = 0
    repo_gpgcheck = 0
    gpgcheck = 1
    gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7
    [ius-source]
    name = IUS for Enterprise Linux 7 - Source
    baseurl = https://repo.ius.io/7/src/
    enabled = 0
    repo_gpgcheck = 0
    gpgcheck = 1
    gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7
    
  2. キャッシュの消去:yum clean all

  3. キャッシュを更新します:yum makecache fast

  4. バージョンの確認:yum list|grep haproxy
    ベース ソースでインストール可能なバージョンは 1.5.18 であることがわかります。ius ソースには、最新の 2.2 を含む多くのバージョンがあります。

    [root@localhost ~]# yum list|grep haproxy
    haproxy.x86_64                              1.5.18-9.el7_9.1           updates  
    haproxy18u.x86_64                           1.8.30-1.el7.ius           ius      
    haproxy20.x86_64                            2.0.30-1.el7.ius           ius      
    haproxy22.x86_64                            2.2.29-1.el7.ius           ius      
    pcp-pmda-haproxy.x86_64                     4.3.2-13.el7_9             updates  
    [root@localhost ~]# 
    
  5. バージョン 2.2 をインストールします。yum install -y haproxy22

  6. インストールされている haproxy を表示します。yum list installed |grep haproxy

  7. バージョンの表示: haproxy -v、バージョンが 2.2.1 であることがわかります。

  8. haproxy ステータスの表示: systemctl status haproxy
    haproxy をまだ開始していないため、現在出力されるステータスは非アクティブです。

3. HAProxyの使用

1.HAProxy設定ファイル

haproxy 設定ファイルは、グローバル設定とプロキシ設定の 2 つの部分で構成され、グローバル、デフォルト、フロントエンド、バックエンド、リッスンの 5 つのセクションに分かれています。

  • global: グローバル構成は、主にグローバル パラメーターを定義するために使用され、プロセス レベルの構成であり、通常はオペレーティング システムの構成に関連します。
  • default: フロントエンド、バックエンド、およびリッスン コンポーネントで使用できるデフォルト パラメーターを構成します。
  • frontend: リクエストを受信するフロントエンド仮想ノード。フロントエンドはバックエンドを指定して、そのバックエンドを具体的に使用できます。
  • backend: バックエンド サービス クラスタ、リアル サーバーの構成。1 つのバックエンドが 1 つ以上のエンティティ サーバーに対応します。
  • listen: フロントエンドとバックエンドの組み合わせ (haproxy インスタンスのステータス監視部分の構成など)。Haproxy1.3以前の唯一の設定方法。

設定ファイルのパスvim /etc/haproxy/haproxy.cfg

グローバルなグローバル構成

global
    log 127.0.0.1 local0  info		//定义haproxy日志输出设置
    log loghost local0 info		//定义haproxy日志级别
    maxconn 20480			//定义最大连接数
    chroot /usr/local/haproxy		//chroot运行路径
    pidfile /var/run/haproxy.pid	//haproxy进程PID文件   
    user haproxy			//运行haproxy用户,可用uid代替
    group haproxy			//运行haproxy用户组,可用gid代替
    daemon				//以后台形式运行haproxy

デフォルト設定

  • フロントエンド、バックエンド、およびリッスン コンポーネントで使用できる構成のデフォルト パラメーターを設定するために使用されます。このセクションで設定したパラメータ値は、デフォルトで以下のフロントエンド、バックエンド、リッスンセクションに自動的に参照されます。一部のパラメーターがパブリック構成に属している場合、それらをデフォルト セクションに 1 回追加するだけで済みます。フロントエンド、バックエンド、リッスン部分もデフォルト部分と同じパラメータで設定されている場合、デフォルト部分のパラメータに対応する値が自動的に上書きされます。
  • mode http: haproxy の実行モードを設定します。{http|tcp|health} の 3 つがあります。注: レイヤ 4 アプリケーション (モード tcp) も haproxy で使用されている場合、ここで haproxy の動作モードを定義することはお勧めできません。
    tcp模式: このモードでは、クライアントとサーバーはレイヤー 7 メッセージの検査を行わずに全二重接続を確立します。デフォルトは tcp モードで、SSL、SSH、SMTP およびその他のアプリケーションでよく使用されます。
    http模式: このモードでは、クライアントのリクエストはバックエンド サーバーに転送される前に深く分割され、RFC 形式と互換性のないリクエストはすべて拒否されます。
    health:基本的には使用されなくなりました。
defaults
    mode http		//所处理的类别(7层代理http,4层代理tcp)
    log global		//引入global定义的日志格式
    option dontlognull	//不记录健康检查日志信息
    option httpclose	//每次请求完毕后主动关闭http通道,haproxy不支持keep-alive模式
    option httplog	//日志类别为http日志格式
    option forwardfor	//如果后端服务器需要获取客户端的真是ip,需要配置的参数,可以从http header中获取客户端的ip
    option redispatch
    balance roundrobin	//设置默认负载均衡方式,轮询方式
    timeout connect 10s	//默认连接超时时间
    timeout client 10s	//默认客户端超时时间
    timeout server 10s	//默认服务器超时时间
    timeout check 10s	//设置超时检查超时时间 
    maxconn 60000	//最大连接数
    retries 3		//3次连接失败就认为服务器不可用,也可以通过后面设置

フロントエンド構成

  • フロントエンドは、haproxy バージョン 1.3 の後にバックエンド コンポーネントとともに導入されたコンポーネントです。これらのコンポーネントを導入することにより、haproxy 構成ファイルの複雑さが大幅に簡素化されます。forntend は、ACL ルールに基づいて使用するバックエンドを直接指定できます。
    のように:
frontend http_80_in 
bind 0.0.0.0:80    //设置侦听端口,即haproxy提供的web服务端口,和lvs的vip类似
mode http	
log  global   
    option httpclose  
    option httplog  
option forwardfor
default_backend  webserver //设置请求默认转发的后端服务池

バックエンド構成は、
バックエンド サービス クラスター、実サーバー、1 つのバックエンドが 1 つ以上のエンティティ サーバーに対応する構成を定義するために使用されます。

backend  webserver  //定义webserver服务器组
mode  http
option  redispath
option  abortonclose
balancer  source   //负载均衡的方式,源哈希算法
cookie  SERVERID  //允许插入serverid到cookie中,serverid后面可以定义
option  httpdchk  GET  /test.html    //心跳测试
server  web1  192.168.92.100:80  cookie  2 weight 3  check  inter 2000  rise 2 fall 3 maconn 8

リッスン構成は、
ステータス ページの監視とバックエンド サーバーの検査によく使用され、フロントとバックエンドの組み合わせです。

listen admin_stats	//frontend和backend的组合体,监控组的名称,按需自定义名称
    bind 0.0.0.0:8189	//侦听端口
    stats enable	//开启监控
    mode http
    log global
    stats uri /haproxy_stats    //监控页面的url访问路径
    stats realm Haproxy\ Statistics  //监控页面的提示信息
    stats auth admin:admin  //监控页面的用户和密码
    #stats hide-version   //隐藏统计页面上的haproxy版本信息
    stats admin if TRUE  //手工启用/禁用,后端服务器haproxy
    stats refresh 30s   //每个30秒自动刷新监控页面

監視インターフェイスにアクセスします。http://192.168.92.110:8189/haproxy_stats
ここに画像の説明を挿入します

2. 負荷分散を実装する

環境整備

CPU名 IPアドレス 述べる
ハプロキシ 192.168.92.110 ハプロキシ
ウェブサーバー 192.168.92.100 ウェブ
ウェブサーバー 192.168.92.1101 ウェブ

listen は単純な負荷分散を実装します。

#实现一个负载均衡
listen  webcluster 0.0.0.0:80
    option  httpchk GET /index.html
    balance roundrobin
    server  inst1 192.168.92.101:80 check inter 2000 fall 3
    server  inst1 192.168.92.100:80 check inter 2000 fall 3

構成ファイルを変更した後、Haproxy を再起動します。
systemctl restart haproxy

ここに画像の説明を挿入します

異なる URL リクエスト ACL を処理するように ACL を設定します。

アクセス コントロール リスト (ACL、Access Control Lists) は、パケット フィルタリングに基づいたアクセス制御技術であり、サーバーから送信されたデータ パケットを設定された条件に従ってフィルタリング (条件一致)、つまり受信パケットをフィルタリングできます。リクエスト メッセージ ヘッダー内のソース アドレス、ソース ポート、ターゲット アドレス、ターゲット ポート、リクエスト メソッド、URL、ファイル サフィックス、その他の情報内容に基づいてマッチングとフィルタリングを行い、通過の許可や破棄などのさらなる操作を実行します。それ。
その他の具体的な利用方法については、Haproxy ACLの設定と事例を参照してください。

次の一般的に使用される URL マッチングは例として示されており、nginx の位置マッチング パスに似ています。Haproxy
の ACL の構成構文とパラメーターは次のとおりです。

acl语法:
acl    <aclname>      <criterion>  [flags]  [operator]  [<value>]
acl 该条acl规则的名称    匹配规范   匹配模式  具体操作符  操作对象类型
frontend http-in
    bind 0.0.0.0:80
    acl web url_beg  /web  #配置路基url 定义为web
    use_backend admin_web if web #如果满足web条件 走admin_web 服务
    default_backend admin_server #默认服务

backend admin_web #定义web服务
    mode http
    balance roundrobin  # Load Balancing algorithm
    option httpchk
    option forwardfor
    server  web1 192.168.92.101:80 check inter 2000 fall 3

backend admin_server #定义后端服务
    mode http
    balance roundrobin  # Load Balancing algorithm
    option httpchk
    option forwardfor
    server  web2 192.168.92.100:80 check inter 2000 fall 3

構成を解析します:

  1. アクセスされた URL にweb フィールドが含まれる場合、192.168.92.101 サーバーに移動します。
  2. その他はデフォルトで 192.168.92.100 サーバーに接続されます。
    ここに画像の説明を挿入します

3. 問題処理の開始


構成ファイルを変更した後、 haproxy を開始できないというエラー メッセージが表示される場合があります。エラー メッセージは次のとおりです:
プロキシの開始 admin_stats: ソケット [0.0.0.0:8189] をバインドできません
ここに画像の説明を挿入します
。解決策:
setsebool -P haproxy_connect_any=1
再起動すると起動します。
systemctl start haproxy

[root@bogon ~]# setsebool -P haproxy_connect_any=1
[root@bogon ~]# systemctl start haproxy

4.ログ処理

Haproxy のログはデフォルトでシステムの syslog に出力されますが、Haproxy のログをより適切に管理するために、通常は運用環境で個別に定義されます。

1.Haproxyログ設定

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg 
# this config needs haproxy-1.1.28 or haproxy-1.2.1
 
global
    #log 127.0.0.1  local0 
    #log 127.0.0.1  local1 notice
     
    log /dev/log    local0 info
    log /dev/log    local0 notice
    
[root@localhost ~]# systemctl restart haproxy

これら 2 行の設定はグローバル オプションに配置され、主に Haproxy の情報を記録し、ログを別のログ ファイルに記録します。

2. rsyslog設定を変更する

管理を容易にするために、Haproxy 関連の構成は独立して定義されhaproxy.conf/etc/rsyslog.d/rsyslog が開始されると、このディレクトリ内のすべての構成ファイルが自動的にロードされます。
vim /etc/rsyslog.d/haproxy.conf

[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogserverity-text == 'info') then -/var/log/haproxy/haproxy-info.log &~
if ($programname == 'haproxy' and $syslogserverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log &~  

haproxy の情報ログを に記録し/var/log/haproxy/haproxy-info.log
通知ログを に記録します/var/log/haproxy/haproxy-notice.log

&~ログ ファイルに書き込んだ後、rsyslog がこの情報の処理を停止することを示します (rainerscript スクリプト言語)

3. rsyslog サービスを再起動し、ログ ファイルが正常に作成されたかどうかを確認します。

[root@localhost ~]# systemctl restart rsyslog
#查看日志文件是否创建成功
[root@localhost ~]# ls -l /var/log/haproxy/haproxy-info.log
[root@localhost ~]# ls -l /var/log/haproxy/haproxy-notice.log

おすすめ

転載: blog.csdn.net/qq_38055805/article/details/129578853