ども、 cloudpackかっぱ (@inokara) です。

例えば…

UserAgent やソース IP で振り分けを行いたい場合には…

acl オプションを利用して…

frontend balancer-test01
  acl foo hdr_sub(User-Agent) Chrome
  acl bar src xxx.xxx.xxx.xxx/32

と書くことが出来るが、異なるソース IP を複数並べたい場合にはチョト辛いので外部ファイルから読み込ませることが出来る。(初めて知った…)

acl は以下のようなオプションが利用出来るようだ。

The following ACL flags are currently supported :

   -i : ignore case during matching of all subsequent patterns.
   -f : load patterns from a file.
   -m : use a specific pattern matching method
   -n : forbid the DNS resolutions
   -M : load the file pointed by -f like a map file.
   -u : force the unique id of the ACL
   -- : force end of flags. Useful when a string looks like one of the flags.

ほほう…。ということで -f をフラッグを利用して…

こんな感じで外部ファイルを読み込むことが出来る

frontend balancer-test01
  acl foo hdr_sub(User-Agent) -f /etc/haproxy/ua.lst
  acl bar src -f /etc/haproxy/ip.lst

おお。

外部ファイルの書き方

決まり事

外部ファイルのフォーマットについては以下のように書かれている。

Empty lines as well as lines beginning with a sharp (‘#’) will be ignored. All leading spaces and tabs will be stripped. If it is absolutely necessary to insert a valid pattern beginning with a sharp, just prefix it with a space so that it is not taken for a comment. Depending on the data type and match method, haproxy may load the lines into a binary tree, allowing very fast lookups. This is true for IPv4 and exact string matching. In this case, duplicates will automatically be removed.

以下、ざっくり意訳。

  • # で始まる行は無視される
  • 先頭のスペースとタブは無視される
  • 重複は自動的に削除
  • IP アドレスやユーザーエージェントを直接記述する

ということなので…

上記で記載した設定例の外部ファイルは以下のように記述する。

# UserAgent
Chrome

IP アドレスのリストは…

# IP List
xxx.xxx.xxx.xxx/32

なるほど、なるほど。

ということで

今日の知見

  • HAProxy の acl は外部ファイルから IP アドレス等のリストを読み込むことが出来る
  • 外部ファイルは各 acl-f ${/path/to/ファイル名} と指定する
  • 外部ファイルには IP アドレスやユーザーエージェントを直接羅列する

ちょっと気になること

  • 外部ファイルって何行くらいまでイケるのか
  • 外部ファイルを読み込むことによるパフォーマンスへの影響

お疲れさまでした。

元記事はこちらです。
HAProxy の acl で外部ファイルを読み込む方法と読み込むファイルの書き方メモ