Haproxy安裝配置及日誌輸出問題
簡介:
軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。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 16 ~ 23 保留為本地使用
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安裝配置及日誌輸出問題