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 狀態
瀏覽 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
留言