1. 程式人生 > >Haproxy安裝配置及日誌輸出問題

Haproxy安裝配置及日誌輸出問題

table block linux操作系統 獲得 寫入 pidfile 服務器集群 dmi 指定

簡介:
軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。LVS就是基於Linux操作系統實現的一種軟負載,HAProxy就是開源的並且基於第三應用實現的軟負載。
HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用於郵件服務器、內部協議通信服務器等),和7層(HTTP)。在4層模式 下,HAproxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy會分析協議,並且能通過允許、拒絕、交換、增加、修改或者刪除請求 (request)或者回應(response)裏指定內容來控制協議,這種操作要基於特定規則。

特點:
haproxy支持四七層,而LVS是四層應用,nginx是七層應用

支持雙機熱備,高可用,負載均衡、虛擬主機,應用代理、

基於TCP和HTTP的 圖形界面查看信息

服務器節點健康檢查功能

一般是lvs在前面做4層,haproxy在後面做七層。

HAproxy配置文件可以分為五部分:

1 2 3 global:   全局配置參數段,主要用來控制Haproxy啟動前的進程及系統相關設置 defaults:  配置一些默認參數,如果frontend,backend,listen等段未設置則使用defaults段設置
1 listen: <br>frontend:  用來匹配接收客戶所請求的域名,uri等,並針對不同的匹配,做不同的請求處理 <br>backend:  定義後端服務器集群,以及對後端服務器的一些權重、隊列、連接數等選項的設置  

1.安裝

1 2 3 4 5 6 7 8 9 wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz tar zcvf haproxy-1.3.20.tar.gz cd haproxy-1.3.20 make TARGET=linux26 PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy (註意,TARGET後面根據本機操作系統內核版本來填寫,PREFIX是要安裝到的目錄) net.ipv4.ip_forward
= 1 #基於NAT模式的負載均衡器都要打開系統轉發功能。 sysctl -p #使修改生效

2.配置
安裝完畢後,進入安裝目錄配置文件,默認情況下目錄裏是沒有.cfg配置文件的,可以回到安裝文件目錄下將examples下的haproxy.cfg拷貝到usr/local/haproxy下。

cd /usr/local/haproxy
vi haproxy.cfg

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 根據實際需求,更改配置文件,我的配置如下 global      #全局設置 log 127.0.0.1 local0           #日誌輸出配置,所有日誌都記錄在本機,通過local0輸出 #log loghost local0 info maxconn 4096             #最大連接數 chroot /usr/local/haproxy uid 99           #所屬運行的用戶uid gid 99           #所屬運行的用戶組 daemon             #以後臺形式運行haproxy nbproc 2             #啟動2個haproxy實例 pidfile /usr/local/haproxy/haproxy.pid    #將所有進程寫入pid文件 #debug #quiet     defaults                #默認設置 #log global log 127.0.0.1 local3 #日誌文件的輸出定向 mode http     #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK option httplog     #日誌類別,采用httplog option dontlognull option forwardfor     #如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip option httpclose     #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現 retries 3     #3次連接失敗就認為服務器不可用,主要通過後面的check檢查 option redispatch     #當serverid對應的服務器掛掉後,強制定向到其他健康服務器 maxconn 2000     #最大連接數 stats uri /stats     #haproxy 監控頁面的訪問地址       瀏覽器中輸入haproxy監控地址:http://10.10.100.39/stats查看狀態 contimeout 5000     #連接超時時間 clitimeout 50000     #客戶端連接超時時間 srvtimeout 50000     #服務器端連接超時時間 stats auth admin:admin     #設置監控頁面的用戶和密碼:Frank stats hide-version     #隱藏統計頁面的HAproxy版本信息 frontend http-in     #前臺 bind *:80 mode http option httplog log global acl web1 hdr(host) -i www.9888.cn 9888.cn   #acl後面是規則名稱,-i是要訪問的域名,如果訪問www.9888.cn 這個域名就分發到下面的webserver1 的作用域。 use_backend webserver1 if web1 backend webserver1      #後臺 mode http balance roundrobin     #負載均衡算法 option httpchk /index.html      #健康檢查 server web01 10.10.100.41:80 check cookie 1 inter 2000 fall 3 weight 30 server web02 10.10.100.18:80 check cookie 2 inter 2000 fall 3 weight 30   #cookie 1表示serverid為1,check inter 1500 是檢測心跳頻率   #rise 2是2次正確認為服務器可用,fall 3是3次失敗認為服務器不可用,weight代表權重.

啟動haproxy:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg  

實現haproxy301域名跳轉:

1 redirect prefix http://oldboy.blog.51.com code 301 if www.9888.cn #當訪問www.9888.cn時跳轉至http://oldboy.blog.51.com

實現haproxy基於URL地址目錄做7層跳轉
比如根據目錄進行過濾轉發:

1 2 3 4 5 acl oldboy_java path_beg /java/ acl oldboy_php path_beg /php/ use_backend webserver if oldboy_java #如果是java就找webserver這個池 use_backend webserver if oldboy_php

實現haproxy基於擴展名做7層跳轉:

1 2 acl oldboy_pic path_end .gif .png .jpg .css .js use_backend nginxpools if olboy_static or oldboy_pic

實現haproxy基於user_agent做7層跳轉

1 2 3 4 5 6 7 acl iphone_users hdr_sub(user-agent) -i iphone redirect prefix http://www.51cto.com if iphone users acl android_users hdr_sub(user-agent) -i android redirect prefix http://www.baidu.com if android_users

實現haproxy基於ip和端口過濾

1 2 3 acl valid_ip src 192.168.1.0/24 block if !valid_ip #如果不符合valid_ip的規則就block拒絕掉

讓haproxy錯誤頁面優雅的顯示

1 errorfile 403 /tec/haproxy/errorfiles/403forbild.html

基於HTTP的直接IP URL方式的健康檢查:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1.>第一種HEAD配置方法 option httpchk HEAD /check.html HTTP/1.0 這種檢測方式就相當於通過curl -i http://127.0.0.1/check.html 或者 wget http://127.0.0.1/check.html訪問地址。 **check.html文件必須在網站根目錄下創建 健康檢查的頻率、時間等參數: maxconn 控制節點的並發連接的 weight 12 權重,權重越大,請求越多 2.>第二種GET配置方式 GET後端server的web頁面 option httpchk GET /index.html HTTP/1.0

backup 和allbackups參數:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 server web1 10.10.100.66:80 check inter 2000 fall 3 weight 30 server web2 10.10.100.67:80 check inter 2000 fall 3 weight 30 server web3 10.10.100.68:80 check inter 2000 fall 3 weight 30 backup 當web1和web2服務停止後,web3再提供服務,這樣可以達到高可用的目的 option allbackups server web1 10.10.100.66:80 check inter 2000 fall 3 weight 30 server web2 10.10.100.67:80 check inter 2000 fall 3 weight 30 server web3 10.10.100.68:80 check inter 2000 fall 3 weight 30 backup server web4 10.10.100.69:80 check inter 2000 fall 3 weight 30 backup 加上 option allbackups後,當web1和web2掛掉後,web3和web4都啟動起來提供服務,不加allbackups則只有一臺提供服務.

haproxy下的RS無法記錄客戶端真實ip的問題

1 2 3 4 5 6 7 在haproxy配置文件裏加入如下參數: listen www option forwardfor 提示:參數最好放在listen www裏面 然後在nginx日誌格式中加"$http_x_forwarded_for" 

###################################################################################

關於haproxy日誌輸出的問題:
CentoS6.5下HAProxy日誌配置詳解:

1 2 3 4 5 6 7 8 9 10 11 syslog這個服務,在Centos5.x中的目錄為:/etc/init.d/syslog 而到了Centos6.x中變成了:/etc/init.d/rsyslog 在配置前,我們先來了解下日誌的level: local0~local7 1623保留為本地使用 emerg 0       系統不可用 alert 1       必須馬上采取行動的事件 crit 2        關鍵的事件 err 3        錯誤事件 warning 4      警告事件 notice 5      普通但重要的事件 info 6       有用的信息 debug 7      調試信息

vim haproxy.conf(在default處添加如下信息)

1 2 3 4 5 6 ######################################## defaults log global option httplog log 127.0.0.1 local3 ########################################

vim /etc/rsyslog.conf(添加如下內容)

1 local3.* /var/log/haproxy.log

vim /etc/sysconfig/rsyslog

1 2 把SYSLOGD_OPTIONS="-m 0" 改成 SYSLOGD_OPTIONS="-r -m 0"

相關解釋說明:
-r:  打開接受外來日誌消息的功能,其監控514 UDP端口;
-x: 關閉自動解析對方日誌服務器的FQDN信息,這能避免DNS不完整所帶來的麻煩;
-m: 修改syslog的內部mark消息寫入間隔時間(0為關閉),例如240為每隔240分鐘寫入一次"--MARK--"信息;
-h: 默認情況下,syslog不會發送從遠端接受過來的消息到其他主機,而使用該選項,則把該開關打開,所有接受到的信息都可根據syslog.conf中定義的@主機轉發過去.  

配置完畢後關閉sellinux然後重啟rsyslog和haproxy 即可.

1 /etc/init.d/rsyslog restart

  

haproxy實現負載均衡的方式:

haproxy + heartbeat

haproxy + keepalive

Haproxy安裝配置及日誌輸出問題