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 の違い
- LVS は Linux オペレーティング システムに基づいてソフト ロード バランシングを実装し、Haproxy と Nginx はサードパーティ アプリケーションに基づいてソフト ロード バランシングを実装します。
- LVS は、レイヤー 4 を実装できる IP ロード バランシング テクノロジですが、ディレクトリや URL に基づく転送は実装できません。Haproxy と Nginx はどちらもレイヤー 4 およびレイヤー 7 テクノロジーを実装でき、Haproxy は TCP および HTTP アプリケーションに包括的な負荷分散ソリューションを提供できます。
- LVS は ISO モデルの第 4 層で動作するため、そのステータス監視機能は単一ですが、Haproxy はより豊富で強力なステータス監視機能を備えており、ポート、URL、スクリプトなどの複数のステータス監視方法をサポートできます。
- Haproxy は強力ですが、全体的なパフォーマンスはレイヤー 4 モードの LVS ロード バランシングよりも低くなります。
- Nginxは主にWebサーバーやキャッシュサーバーとして使用されます
- Haproxy は仮想ホストもサポートします
- Haproxy は 8 つのロード バランサー戦略をサポートします
- Haproxy の利点は、セッション保持、Cookie ガイダンスのサポート、指定された URL の取得によるバックエンド サーバーのステータスの検出のサポートなど、nginx の欠点の一部を補うことができます。
- Haproxy は LVS に似ており、単なる負荷分散ソフトウェアですが、効率の点では、負荷分散速度が Nginx より優れており、同時処理の点でも Nginx より優れています。
- Haproxy は TCP プロトコルのロード バランシング転送をサポートします
1 枚の図は比較をまとめたもの
で、Nginx、LVS、HAProxy の 3 つの負荷分散ソフトウェアの長所と短所、適用性、規模の観点から詳細に比較しています。
2. HAProxy の機能と利点:
- 独自SSLをサポートし、クライアントSSLとサーバーSSLの両方をサポートします。
- IPv6 および UNIX ソケットをサポート
- HTTP キープアライブのサポート
- HTTP/1.1圧縮をサポートして帯域幅を節約
- 最適化された正常性検出メカニズム (SSL、スクリプト化された TCP、チェック エージェントなど) をサポートします。
- レイヤ 7 負荷分散をサポートします。
- 信頼性と安定性は非常に優れています。
- 同時接続数は40,000~50,000、単位時間あたりの最大リクエスト処理数は20,000、最大データ処理速度は10Gbpsです。
- 8 つの負荷分散アルゴリズムをサポートし、セッション保持をサポートします。
- 仮想ホスティングをサポートします。
- 接続拒否と完全に透過的なプロキシをサポートします。
- サーバーステータス監視ページがあります。
- ACLをサポートします。
3. HAProxy がセッションを維持するための 3 つのソリューション
HAProxy は、同じクライアントがサーバーにアクセスできるようにセッションを維持します。解決策としては、クライアント IP、Cookie、セッションの 3 つがあります。
- ハッシュはクライアント IP を通じて計算され保存され、同じ IP がプロキシ サーバーにアクセスするときに固定実サーバーに転送できるようになります。
- セッション維持のため、実サーバーに依存してクライアントの Cookie 情報を送信します。
- セッションの永続性を実現するために、実サーバーのセッションとサーバー ID が保存されます。(HAProxy では、バックエンド サーバーがネットワークに接続できることのみが必要であり、LVS のような面倒な ARP 構成は必要ありません)
4. HAProxy のバランス 8 負荷分散アルゴリズム:
roundrobin
: 加重ラウンドロビンに基づきます。static-rr
: 加重ラウンドロビンに基づきます。静的アルゴリズム、実行時の変更は有効になりませんsource
:リクエスト元IPに基づくアルゴリズム。リクエストの送信元 IP に対してハッシュ操作を実行し、その結果をバックエンド サーバーの合計の重みで割って、一致するサーバーに転送します。同じ IP からのクライアント要求を常に特定のバックエンド サーバーに転送できるようにします。leastconn
: 最小限の接続。(データベースの負荷分散に適していますが、セッションが短い環境には適していません)uri
: URI の一部または全体に対してハッシュ操作を実行し、それをサーバーの合計の重みで割って、最後に一致するバックエンドに転送します。uri_param
: バックエンド サーバーの数が変わらない場合でも、同じユーザー リクエストが同じマシンに確実に配信されるように、URL パスのパラメーターに従って転送します。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 をインストールします。
-
システムの 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
-
リポジトリ情報ファイルをダウンロードする
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 1月 3 14:05 ius-release-el7.rpm
-
epel-releaseをインストールする
yum -y install epel-release
-
ius-release-el7.rpm をインストールする
rpm -Uvh ius-release*rpm
-
haproxy バージョン 2.2 をインストールする
yum install haproxy22
-
ハプロキシを開始する
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 ソースを提供します。
-
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
-
キャッシュの消去:
yum clean all
-
キャッシュを更新します:
yum makecache fast
-
バージョンの確認:
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 ~]#
-
バージョン 2.2 をインストールします。
yum install -y haproxy22
-
インストールされている haproxy を表示します。
yum list installed |grep haproxy
-
バージョンの表示:
haproxy -v
、バージョンが 2.2.1 であることがわかります。 -
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
構成を解析します:
- アクセスされた URL に
web
フィールドが含まれる場合、192.168.92.101 サーバーに移動します。 - その他はデフォルトで 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