haproxy 是為了要讓負載、流量分散,原本服務的 web 可能只有一台,現在要讓兩台以上來提供服務,讓網站可以順順的運作。

而架設 haproxy 的主機不能有 http 或 80 port 被 listen 起來,因為 haproxy 會使用到它,又或者你想讓瀏覽變成 http://xx.xx.xx.xx:8080 這樣子連也是可以的。

haproxy 還可修改表頭資料呢,新增、刪除、或者是允許、不允許什麼字串的,也可以過濾第四層、第七層,對 session、cookie 作動作

環境

haproxy(1.5.2): 10.10.10.134
node1: 10.10.10.137
node2: 10.10.10.135

這兩個 node 只是 web service 而已,不用作 haproxy 什麼設定的,所以以下都只在 haproxy 主機上

安裝

yum -y install haproxy

設定

在 /etc/haproxy/haproxy.cfg 加入,這邊是直接設定要分流的設定即可,我沒去動到原本 haproxy.cfg 裡頭的設定

設定方向是連 10.10.10.134:80 (也就是 haproxy 主機) 時會分流到 10.10.10.137:80  與 10.10.10.135:80 兩台 node 身上,134 這台只是轉發而已

cat <<EOF>> /etc/haproxy/haproxy.cfg
listen stats :8080          # stats 可以查看狀態
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth admin:123456    # 帳號密碼
    stats refresh 10s

# web
listen web :80
    mode http
    balance roundrobin
    option httpclose
    option forwardfor
    server node1 10.10.10.137:80 check weight 1 maxconn 50
    server node2 10.10.10.135:80 check weight 1 maxconn 30
    option redispatch
    retries         3
EOF

啟動

service haproxy start

或者用 debug 模式

/usr/sbin/haproxy -d -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid

我就可以

瀏覽 http://10.10.10.134:8080 查看 haproxy 狀態

haproxy stats

瀏覽 http://10.10.10.134 查看到網站內容,可以看到網頁內容在 node1 與 node2 之間換來換去就是成功了

或者綁兩個 ip,個別作服務

# web1
listen web1 10.10.10.134:8888
    mode http
    balance roundrobin
    server node1 10.10.10.137:80 check weight 3 maxconn 3
    server node2 10.10.10.135:80 check weight 1 maxconn 3
    option httpclose
    option forwardfor
    option redispatch
    retries         3

# web2
listen web2 10.10.10.180:55555
    mode http
    balance roundrobin
    server node1 10.10.10.137:80 check weight 2 maxconn 3
    server node2 10.10.10.135:80 check weight 3 maxconn 3 
    option httpclose
    option forwardfor
    option redispatch
    retries         3

又或者使用 frontend + backend 方式

frontend http-in
    bind *:80
    default_backend group1

backend group1
    mode http
    server node1 10.10.10.137:80 check
    server node2 10.10.10.135:80 check
    option httpclose  
    option forwardfor 
    option redispatch

設定值是愈下面的會蓋過於上面的

設定大項

  • global
  • defaults
  • 包含 listen、frontend、backend,而 defaults 的設定可以設定在這裡

小項

  • frontend : 接收 request 的 listen sockets
  • backend : 將接收到的 request 連線 forward 給 real server
  • listen: 可設定 listen XXX_name IP:port 或 listen XXX_name IP:port,IP2:port2,IP 可以是 * 號或空白
    可用的還有
    bind
    mode: tcp | http | health,預設為 http
    balance: 使用演算法,有 roundrobin 等,其它如下
    server
    option

defaults 參數

  • option httplog                                              # 記錄 request, session, timers
  • option http-server-close                             # 啟用 HTTP connection closing on the server side
  • option forwardfor except 127.0.0.0/8          # X-Forwarded-For header 裡面會有 client 的 IP,HAProxy 會利用此 header,增加此設定可讓 X-Forwarded-For header 都轉送到後端的 server。將 HTTP X-Forwarded-For 標頭新增至要求中,如果您想要保留用戶端的 IP 位址,則需要使用此選項
  • option redispatch                        # 當 client 連到掛掉的機器時, 可重新再分配
  • retries 3                                      # 失敗重試次數
  • timeout http-request 10s            # 等待 HTTP Request 完成的時間
  • timeout queue 1m                      # 等待 queue 釋放空間的時間
  • timeout connect 10s                  # 等待連線成功的時間
  • maxconn XXX                            # 同時間最大連線數
  • rspadd XXX                                # 在回應表頭後面加入字串
  • reqadd XXX                                # 在要求表頭後面加入字串

balance 參數

  • roundrobin
  • static-rr
  • lastconn
  • first                      # 選擇第一個 node 連線,達到 maxconn 時才選擇下一個
  • source                 # 把 source ip hashed 後,再除以 total weight of running server 來選擇 node,確保連到同一個 node,如果 node 數量改變了,就重新計算
  • uri                        # 用 uri hashed 計算
  • url_param            # 使用 HTTP GET REQUEST URL
  • hdr
  • rdp-cookie

server 參數

  • cookie 1                  # 表示 serverid=1
  • check                      # 檢查健康狀況
  • check inter 1500     #  如果要定時間就用這個
  • rise 3                       # 表示 3 次 ok 為可用
  • fall 3                        # 表示 3 次不 ok 為不可用
  • weight                     # 權重

httpchk 參數,也是健康檢查

  • option httpchk <method> <uri> <version> 用 http 協定檢查 server 健康狀態,後面可以帶連結
    option httpchk GET /index.html HTTP/1.0
    option httpchk   等於 option httpchk OPTIONS / HTTP/1.0
    option httpchk * 等於 option httpchk OPTIONS * HTTP/1.0
最後修改日期: 2015 年 06 月 05 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。