一 HAProxy簡介
HAProxy是一種高效、可靠、免費的高可用及負載均衡解決方案,非常適合於高負載站點的七層數據請求。客戶端通過HAProxy代理服務器獲得站點頁面,而代理服務器收到客戶請求后根據負載均衡的規則將請求數據轉發給后端真實服務器。
同一客戶端訪問服務器,HAProxy保持回話的三種方案:
1 HAProxy將客戶端ip進行Hash計算並保存,由此確保相同IP訪問時被轉發到同一真實服務器上。
2 HAProxy依靠真實服務器發送給客戶端的cookie信息進行回話保持。
3 HAProxy保存真實服務器的session及服務器標識,實現會話保持功能。
haproxy拓撲結構圖
二 配置文件解析
Haproxy安裝后默認沒有配置文件,需要手動創建/etc/haproxy.cfg。啟動haproxy時用-f指定配置文件路徑。haproxy的配置文件包含全局設置段與代理段,global是全局段,defaults、listen、frontend、backend為代理段。frontend用來匹配客戶端請求的域名或者URL;backend定義后端服務器集群
haproxy配置文件參數詳細解析
配置項 | 描述 | |
global |
chroot<jail dir> | 將工作目錄切換到<jail dir>並執行chroot |
daemon | 后台工作模式 | |
uid | 進程賬戶id,建議設置為haproxy專用賬戶 | |
gid | 進程組id,建議設置為haproxy專用組 | |
log<address><facility> | 配置全局syslog,可以設置兩台日志服務器 | |
nbproc<number> | 指定后台進程數量 | |
pidfile<file> | 指定pid文件 | |
ulimit-n<number> | 設置每個進程最大文件描述符數量 |
|
maxconn<number> | 每個進程支持的最大並發數 | |
tune.bufsize<number> | 設置buffer大小,默認16384B | |
代理 設置 |
mode | 可選tcp、http、health |
timeout check<timeout> | 設置檢查超時時間 | |
contimeout<timeout> | 設置連接超時時間 | |
balance roundrobin | 設置輪詢負載 | |
bind<address>:port | 定義一個或者多個監聽地址和端口 | |
stats auth admin:admin | 設置監控界面的用戶名和密碼 | |
stats refresh<number> | 統計頁面刷新間隔時間 | |
option httplog | 使用http日志 | |
cookie<name> | 啟用cookie的保持連接功能 | |
option forwardfor | 允許插入這種數據包頭,可以讓后端服務器獲取客戶端ip | |
option abortonclose | 負載高時,自動關閉處理時間長的請求 | |
option allbackups | 后端服務器宕機,是否激活全部備機,默認啟動第一個備機 | |
option dontlognull | 不記錄空連接日志,主要用於不記錄健康檢查日志 | |
option redispatch | 后端某個機器宕機,強制把請求轉發給健康機器 | |
monitor-uri<URi> | 檢查uri文件是否存在,依次判斷主機的健康狀態 | |
monitor-fail if site_dead | 服務器宕機時,返回503代碼 | |
option httpchk<uri> | 使用http協議檢查服務器健康狀態 | |
retries<value> | 服務器連接失敗后的重試次數 | |
timeout client | 客戶端最大超時時間,單位毫秒 | |
timeout server | 服務器最大超時時間,單位毫秒 | |
timeout connect | 最大連接超時時間,單位毫秒 | |
default_backend | 默認后端服務器組 | |
use_backend | 當條件滿足時,指定后端服務器組 | |
acl<name><criterion> | 定義訪問控制列表 |
三 Haproxy實例部署
本例使用listen定義一個監控端口;
使用frontend定義一個前端80端口;
通過backend定義名為inside_servers 和 external_servers的服務器組;
使用default_backend定義默認服務器組external_servers;
external_servers包括web1.test.com和web2.test.com 兩台服務器
inside_servers包含web3.test.com 一台服務器
服務器名稱 | 網絡配置 |
haproxy.test.com | eth0:10.10.10.10 |
eth1:192.168.1.2 | |
web1.test.com | eth0:192.168.1.3 |
web2.test.com | eth0:192.168.1.4 |
web3.test.com | eth0:192.168.1.5 |
1 首先配置web服務器
在web1 web2 web3上安裝httpd並配置網卡
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.3
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
ONBOOT=yes
TYPE=Ethernet
service network restart
yum install -y httpd
iptables -F
iptables -X
service iptables save
setenforce 0
sed -i s/enforcing/disabled/g /etc/sysconfig/selinux
echo "web1 192.168.1.3" > /var/www/html/index.html
service httpd restart
chkconfig httpd on
web2 web3機器上執行與web1相同步驟,注意修改部分參數
2 接着haproxy服務器配置
設置兩塊網卡
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.10.10.10
NETMASK=255.0.0.0
ONBOOT=yes
TYPE=Ethernet
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
IPADDR=192.168.1.2
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
TYPE=Ethernet
service network restart
service iptables stop
內核調優,修改系統文件
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
配置日志文件,添加三行
vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
yum -y install gcc
wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.11.tar.gz
tar zxf haproxy-1.6.11.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.6.11/
make TARGET=linux2628
make install
mkdir /var/haproxy
3 創建配置文件
vim /etc/haproxy.cfg
global
maxconn 4096
log 127.0.0.1 local3 info
chroot /var/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /var/run/haproxy.pid
ulimit-n 65535
stats socket /var/tmp/stats
defaults
log global
mode http
maxconn 20480
option httplog
option httpclose
option dontlognull
option forwardfor
option redispatch
option abortonclose
stats refresh 30
retries 3
balance roundrobin
cookie SRV
timeout check 2000ms
timeout connect 5000ms
timeout server 50000ms
timeout client 50000ms
listen admin_status #定義haproxy的監控界面
bind 0.0.0.0:6553
mode http
log 127.0.0.1 local3 info
stats enable
stats refresh 5s #監控頁面自動刷新時間5s
stats realm Haproxy\ Statistics #登錄監控頁面提示符
stats uri /admin?stats #監控頁面URL路徑
stats auth admin:123456 #監控頁面的賬戶密碼
stats hide-version #隱藏haproxy版本
frontend web_service #定義前端服務器
bind 0.0.0.0:80
mode http
log global
option httplog
option httpclose
option forwardfor
#acl inside_src src 192.168.1.0/24 #定義acl
#use_backend inside_servers if inside_src #判斷acl的源地址,把請求轉發到inside_servers組
default_backend external_servers #默認服務器組
backend external_servers
mode http
balance roundrobin #輪詢真實服務器
option httpchk GET /index.html #檢查index文件,判斷服務器是否健康
##定義后端真實服務器,向cookie中插入web1信息,check進行健康檢查,檢查時間間隔為2000ms,##連續兩次健康則認為是正常開啟的,連續三次檢查失敗則認為宕機,服務器權重1
server web1 192.168.1.3:80 cookie web1 check inter 2000 rise 2 fall 3 weight 1
server web2 192.168.1.4:80 cookie web2 check inter 2000 rise 2 fall 3 weight 1
#backend inside_servers
#mode http
#balance roundrobin #輪詢真實服務器
#option httpchk GET /index.html #檢查index文件,判斷服務器是否健康
#server web3 192.168.1.5:80 cookie web3 check inter 2000 rise 2 fall 3 weight 1
4 啟動haproxy服務
service rsyslog restart #重啟系統日志服務
haproxy -f /etc/haproxy.cfg #啟動haproxy服務
echo "/usr/local/sbin/haproxy -f /etc/haproxy.cfg" >> /etc/rc.local
5 測試驗證
瀏覽器訪問監控頁面
在一個ip為10.10.10.100的機器上訪問http://10.10.10.10:6553/admin?stats
多次刷新訪問將得到web1和web2 不同頁面信息
如果配置文件中開啟使用inside_servers,則在192.168.1.0/24網段機器上訪問http://192.168.1.2,服務器返回的會一直是web3的頁面信息。