こんにちは
今回は表題の通り、OSSのHAProxyを少しだけ触ってみました
触ろうと思った理由は、90%は何となくですが、残りの10%はAWSのALB以外にロードバランサを触ってみたかったからです
なお、あくまで備忘録程度となるので、詳細なことはあまり書きません
■HAProxyとは
少し前述しましたが、L4とL7で動作可能なOSSの高機能プロキシ/ロードバランサです
L7層も利用可能なので、URLベースやHTTPヘッダーを利用した振り分けなどが可能となります
また、多くのLinuxディストリビューションでパッケージが提供されているので、容易にインストールできることも大きな未了です
■環境と構成
Virtulabox + Vagrant を利用したローカル環境で動作検証してみました
lb01:ロードバランサ用サーバー、AlmaLinux9、IP:192.168.33.99
almaweb01:web01用サーバー、AlmaLinux9、IP:192.168.33.100
almaweb02:web02用サーバー、AlmaLinux9、IP:192.168.33.101
通信自体は下記のようになります
クライアント → lb01 → almaweb01 or almaweb02 へ振り分け
■手順
1. Web機の準備
それぞれにApacheのインストールと簡単なセットアップを実施しました
・web01
dnf install httpd -y
vi /etc/httpd/conf.d/almaweb01.com.conf
<VirtualHost *:80>
ServerName almaweb01.com
DocumentRoot /var/www/vhosts/almaweb01.com/public_html
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
</VirtualHost>
mkdir -p /var/www/vhosts/almaweb01.com/public_html
echo "almaweb01.com" > /var/www/vhosts/almaweb01.com/public_html/index.html
systemctl start httpd
systemctl status httpd
・web02
ほとんどweb01と同じですが、ホスト名などを almaweb02 としています
vi /etc/httpd/conf.d/almaweb02.com.conf
<VirtualHost *:80>
ServerName almaweb02.com
DocumentRoot /var/www/vhosts/almaweb02.com/public_html
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
</VirtualHost>
mkdir -p /var/www/vhosts/almaweb02.com/public_html
echo "almaweb02.com" > /var/www/vhosts/almaweb02.com/public_html/index.html
systemctl start httpd
systemctl status httpd
2. LB機の準備
下記でHAProxyをインストールします
dnf install haproxy
Last metadata expiration check: 0:15:05 ago on Sun May 3 08:20:43 2026. Dependencies resolved. ============================================================================================================================================================================================================================================= Package Architecture Version Repository Size ============================================================================================================================================================================================================================================= Installing: haproxy x86_64 2.8.14-1.el9_7.1 appstream 2.5 M Transaction Summary ============================================================================================================================================================================================================================================= Install 1 Package Total download size: 2.5 M Installed size: 7.7 M Is this ok [y/N]: y Downloading Packages: haproxy-2.8.14-1.el9_7.1.x86_64.rpm 6.7 MB/s | 2.5 MB 00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 1.7 MB/s | 2.5 MB 00:01 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Running scriptlet: haproxy-2.8.14-1.el9_7.1.x86_64 1/1 Installing : haproxy-2.8.14-1.el9_7.1.x86_64 1/1 Running scriptlet: haproxy-2.8.14-1.el9_7.1.x86_64 1/1 Verifying : haproxy-2.8.14-1.el9_7.1.x86_64 1/1 Installed: haproxy-2.8.14-1.el9_7.1.x86_64 Complete!
HAProxyを起動してみます
systemctl start haproxy
systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; preset: disabled)
Active: active (running) since Sun 2026-05-03 08:37:44 UTC; 11s ago
Process: 13976 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -f $CFGDIR -c -q $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 13998 (haproxy)
Status: "Ready."
Tasks: 3 (limit: 24466)
Memory: 6.4M
CPU: 259ms
CGroup: /system.slice/haproxy.service
tq13998 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d -p /run/haproxy.pid
mq14017 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d -p /run/haproxy.pid
May 03 08:37:44 lb01 haproxy[13998]: [NOTICE] (13998) : New worker (14017) forked
May 03 08:37:44 lb01 haproxy[13998]: [NOTICE] (13998) : Loading success.
May 03 08:37:44 lb01 systemd[1]: Started HAProxy Load Balancer.
May 03 08:37:44 lb01 haproxy[14017]: [WARNING] (14017) : Server static/static is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 11ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeu>
May 03 08:37:44 lb01 haproxy[14017]: [ALERT] (14017) : backend 'static' has no server available!
May 03 08:37:45 lb01 haproxy[14017]: [WARNING] (14017) : Server app/app1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 3 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 >
May 03 08:37:45 lb01 haproxy[14017]: [WARNING] (14017) : Server app/app2 is DOWN, reason: Layer4 connection problem, info: "General socket error (Permission denied)", check duration: 0ms. 2 active and 0 backup servers left. 0 sessions >
May 03 08:37:46 lb01 haproxy[14017]: [WARNING] (14017) : Server app/app3 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 >
May 03 08:37:46 lb01 haproxy[14017]: [WARNING] (14017) : Server app/app4 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 >
May 03 08:37:46 lb01 haproxy[14017]: [ALERT] (14017) : backend 'app' has no server available!
→ 問題なく起動してそうです
簡単にHAProxyのconfファイルを確認してみます
vi /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main
bind *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
→ デフォルトでは 5000番ポートでListenしており、バックエンドもループバックアドレスが指定されてそうです
3. 振り分けの設定
それでは、HAProxyでWeb01とWeb02へ振り分けるように設定してみます
なお、注意点としては、HAProxyが80番ポートでリッスンする必要があります
confファイルのバックアップ取得
cp -ip /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_org
下記のように編集します
vi /etc/haproxy/haproxy.cfg
~割愛~
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main
bind *:80 ★
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server almaweb01 192.168.33.100:80 check ★
server almaweb02 192.168.33.101:80 check ★
→ bindで80番ポートを指定し、backend app の server で各web機のプライベートIPアドレスを指定しています
設定変更後、HAProxyを再起動します
systemctl restart haproxy
4. 動作確認
最後にブラウザから lb機のIPアドレス(192.168.33.99)へアクセスし、web01/02 の画面がランダムに表示されることを確認してみます
http://192.168.33.99
→ web01の画面が表示されています
→ web02側の画面が表示されてそうです
それぞれランダムに振り分けられてそうなのでOKですね
5. 統計情報を表示する
どうやらHAProxyでは統計情報もブラウザ上から確認できるみたいなので、設定してみます
まずはconfファイルで設定を有効化します
※こちらの記事が大変参考になりました。誠にありがとうございます。
vi /etc/haproxy/haproxy.cfg
~割愛~
backend app
balance roundrobin
server almaweb01 192.168.33.100:80 check
server almaweb02 192.168.33.101:80 check
stats enable ★
stats hide-version ★
stats uri /stats ★
stats auth haproxyadmin:password1234 ★
→ statsの項目を追記します
設定反映のため再起動します
systemctl restart haproxy
ブラウザから確認します
http://192.168.33.99/stats
→ almawebの情報やサービスの起動時間などOSSでは十分すぎるくらい充実しており驚きました
■最後に
いかがでしたでしょうか
簡単にインストールしたりできる割にかなり機能も充実しておりましたので、AWSなどを利用できない環境では、正直これ一択かなとも思ってしまいました
また、統計情報も簡単に確認可能なので、運用面もしっかり考えられていると感じました
今回は最小限の機能のみ触っただけでしたが、それでもかなり面白かったので、今後もし触る機会があればもっとちゃんと勉強しようと思います


