拓撲:haproxy代理分發器:192.168.2.100
web1===192.168.2.131
web2===192.168.2.132
-
安裝
[root@CO7 ~]#yum -y install gcc gcc-c++ autoconf automake [root@CO7 ~]# tar -zxf haproxy-1.8.0.tar.gz [root@CO7 ~]# cd haproxy-1.8.0 [root@CO7 haproxy-1.8.0]# uname -r 3.10.0-693.el7.x86_64 [root@CO7 haproxy-1.8.0]# make TARGET=linux2628 PREFIX=/usr/local/haproxy [root@CO7 haproxy-1.8.0]# make install PREFIX=/usr/local/haproxy
-
沒有生成配置文件,手動添加haproxy配置文件
[root@CO7 haproxy-1.8.0]# ls /usr/local/haproxy/ doc sbin share [root@CO7 haproxy-1.8.0]# mkdir /usr/local/haproxy/etc
[root@CO7 haproxy-1.8.0]# vim /usr/local/haproxy/etc/haproxy.cfg global log 127.0.0.1 local0 #log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 chroot /usr/local/haproxy uid 99 #所屬運行的用戶uid,運行用戶nobody gid 99 #所屬運行的用戶組 daemon #以後臺形式運行haproxy nbproc 1 #啓動1個haproxy實例。# #工作進程數量(CPU數量) ,實際工作中,應該設置成和CPU核心數一樣。 這樣可以發揮出最大的性能。 pidfile /usr/local/haproxy/run/haproxy.pid #將所有進程寫入pid文件 #debug #調試錯誤時用 #quiet #安靜 defaults log global log 127.0.0.1 local3 #日誌文件的輸出定向。產生的日誌級別爲local3. 系統中local1-7,用戶自己定義 mode http #工作模式,所處理的類別,默認採用http模式,可配置成tcp作4層消息轉發 option httplog #日誌類別,記載http日誌 option httpclose #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現 option dontlognull #不記錄空連接,產生的日誌 option forwardfor #如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip option redispatch #當serverid對應的服務器掛掉後,強制定向到其他健康服務器 retries 2 #2次連接失敗就認爲服務器不可用,主要通過後面的check檢查 maxconn 2000 #最大連接數 balance roundrobin #負載均衡算法 stats uri /haproxy-stats #haproxy 監控頁面的訪問地址 # 可通過 http://localhost:80/haproxy-stats 訪問 timeout connect 5000 #連接超時時間。 單位:ms 毫秒 timeout client 50000 #客戶端連接超時時間 timeout server 50000 #服務器端連接超時時間 mode http option httpchk GET /index.html #健康檢測#注意實際工作中測試時,應該下載某一個頁面來進行測試,因此這個頁面應該是個小頁面,而不要用首頁面。這裏是每隔一秒檢查一次頁面。 frontend http #前端配置,http名稱可自定義 bind 0.0.0.0:80 #發起http請求80端口,會被轉發到設置的ip及端口 default_backend http_back #轉發到後端 寫上後端名稱 backend http_back #後端配置,名稱上下關聯 server s1 192.168.2.131:80 weight 3 check #後端的主機 IP &權衡 server s2 192.168.2.132:80 weight 3 check #後端的主機 IP &權衡 #server node1 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30
# inter 2000 健康檢查時間間隔2秒 # rise 3 檢測多少次才認爲是正常的 # fall 3 失敗多少次才認爲是不可用的 # weight 30 權重
關於負載均衡算法
#source 根據請求源IP
#static-rr 根據權重
#leastconn 最少連接者先處理
#uri 根據請求的uri
#url_param 根據請求的url參數
#rdp-cookie 據據cookie(name)來鎖定並哈希每一次請求
#hdr(name) 根據HTTP請求頭來鎖定每一次HTTP請求
#roundrobin 輪詢方式
3.複製haproxy啓動腳本,到/etc/init.d下
[root@CO7 haproxy-1.8.0]# cp /root/haproxy-1.8.0/examples/haproxy.init /etc/init.d/haproxy
[root@CO7 haproxy-1.8.0]# chmod 755 /etc/init.d/haproxy
[root@CO7 haproxy-1.8.0]# vim
vim vimdiff vimtutor
[root@CO7 haproxy-1.8.0]# vim /etc/init.d/haproxy
#!/bin/sh
# chkconfig: - 85 15
# description: HA-Proxy server
# processname: haproxy
# config: /usr/local/haproxy/etc/haproxy.cfg #修改
# pidfile: /usr/local/haproxy/run/haproxy.pid #修改
# Source function library.
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
# This is our service name
BASENAME=`haproxy` #修改
BIN=/usr/sbin/haproxy #修改
CFG=/usr/local/haproxy/etc/haproxy.cfg
[ -f $CFG ] || exit 1
PIDFILE=/usr/local/haproxy/run/haproxy.pid #修改
LOCKFILE=/usr/local/haproxy/run/haproxy #修改
RETVAL=0
start() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
echo -n "Starting $BASENAME: "
daemon $BIN -D -f $CFG -p $PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $LOCKFILE
return $RETVAL
}
stop() {
echo -n "Shutting down $BASENAME: "
killproc $BASENAME -USR1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
[ $RETVAL -eq 0 ] && rm -f $PIDFILE
return $RETVAL
}
restart() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
stop
start
}
reload() {
if ! [ -s $PIDFILE ]; then
return 0
fi
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
$BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
}
check() {
$BIN -c -q -V -f $CFG
}
quiet_check() {
$BIN -c -q -f $CFG
}
rhstatus() {
status $BASENAME
}
condrestart() {
[ -e $LOCKFILE ] && restart || :
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
status)
rhstatus
;;
check)
check
;;
*)
echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
exit 1
esac
exit $?
4.複製haproxy文件到/usr/sbin下 (因爲上面的haproxy.init啓動腳本默認會去/usr/sbin下找)[root@CO7 haproxy-1.8.0]#cp /usr/local/haproxy/sbin/haproxy /usr/sbin/
創建目錄和權限
[root@CO7 haproxy-1.8.0]# mkdir -p /usr/local/haproxy/run
[root@CO7 haproxy-1.8.0]# chown nobody /usr/local/haproxy/ -R
配置日誌收集
[root@CO7 haproxy-1.8.0]# vim /etc/rsyslog.conf #打開以下兩行的註釋,不打開收不到日誌
15 $ModLoad imudp #取消註釋
16 $UDPServerRun 514 #取消註釋
73 local7.* /var/log/boot.log #下面添加兩行
74 local3.* /var/log/haproxy.log
75 local0.* /var/log/haproxy.log
[root@CO7 haproxy-1.8.0]# systemctl restart rsyslog
5.啓動和停止服務
<1>特殊啓動方法1
[root@CO7 haproxy-1.8.0]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
[root@CO7 haproxy-1.8.0]# ps -aux | grep haproxy
nobody 1763 0.0 0.0 14756 1088 ? Ss 16:03 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid
root 1768 0.0 0.0 112676 980 pts/0 S+ 16:04 0:00 grep --color=auto haproxy
[root@CO7 haproxy-1.8.0]# netstat -antup | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1763/haproxy
<2>停止服務[root@CO7 haproxy-1.8.0]# killall haproxy#沒有killall命令安裝yum -y install psmisc
<3>HAproxy腳本啓動方法2[root@CO7 haproxy-1.8.0]# /etc/init.d/haproxy start 或 systemctl restart haproxy
<4>配置開機啓動
[root@CO7 haproxy-1.8.0]# chkconfig --add haproxy
[root@CO7 haproxy-1.8.0]# chkconfig haproxy on
6.後端web測試頁面配置
[root@Qj02 html]# yum install httpd php -y
[root@Qj03 html]# yum install httpd php -y
生成測試文件:
[root@Qj02 html]#echo 192.168.2.131 > /var/www/html/index.html
[root@Qj03 html]#echo 192.168.2.132 > /var/www/html/index.html