1 Linux Haproxy 負載均衡 v1.8 ★★★php

相似於ningx的反向代理
1.1 Haproxy 概述css

Haproxy是一個開源的高性能的反向代理或者說是負載均衡服務軟件之一,它支持雙機熱備、虛擬主機、基於TCP和HTTP應用代理等功能。其配置簡單,維護方便,並且擁有很好的對服務器節點的健康檢查功能(至關於keepalived健康檢查),當其代理的後端服務器出現故障時,Haproxy會自動的將該故障服務器摘除,當服務器的故障恢復後,Haproxy還會自動將該RS服務器加入進來提供服務。
Haproxy特別適用於那些高負載、訪問量很大。但又須要會話保持或七層應用代理的業務。Haproxy運行在普通的服務器硬件上,幾乎不須要進行更多的優化就能夠支 持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單、安全的整合到各類網站的架構中,同時,haproxy的代理模式,可使得應用服務器不會暴露到網絡中。即後面的節點服務器不須要公網IP地址
Haproxy 工做在4層和7層,LVS工做在4層,naginx工做在7層,工做方式和nginx負載均衡類似,在配置文件中配置節點,而後經過算法輪詢,html

HAproxy優勢:
一、 HAProxy是支持虛擬主機的,能夠工做在四、7層(支持多網段);
二、 可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做;
三、 支持url檢測後端的服務器;
四、 它跟LVS同樣,自己僅僅就只是一款負載均衡軟件;單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的;
五、 HAProxy能夠對Mysql讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,HAProxy的支持多種算法。前端

1.1.1 Haproxy 解決方案拓撲圖linux

2.1 Haproxy L4負載均衡應用架構拓撲
Haproxy軟件的四層tcp代理應用很是優秀,配置很是簡單方便,比LVS和Nginx要方便不少,由於不須要在RS端執行腳本便可實現應用代理。
說明:因爲Haproxy採用的是NAT模式,數據包來去都會通過Haproxy,所以,在流量特別大的狀況下,其性能不如LVS。
在通常的中小型公司,建議採用haproxy作負載均衡,而不要使用LVS或者Nginx。
2.2 Haproxy L7負載均衡應用架構拓撲
Haproxy軟件的最大優勢在於其7層的根據URL請求頭應用過濾的功能,通常用在LVS軟件的下一層,或者像官方推薦的能夠掛在硬件負載均衡NS、F5下使用。nginx

實施部署前主機規劃列表
名稱 接口 IP 用途
MASTER
外網 eth0 192.168.1.81 外網管理IP,用於WAN數據轉發
內網 eth1 192.168.2.81 內網管理IP,用於LAN數據轉發
心跳線 eth2 192.168.3.81 用於服務器間心跳鏈接(直連)能夠省略
vip 192.168.1.181 用於提供應用程序A掛載服務
BACKUP
外網 eth0 192.168.1.82 外網管理IP,用於WAN數據轉發
內網 eth1 192.168.2.82 內網管理IP,用於LAN數據轉發
心跳線 eth2 192.168.3.82 用於服務器間心跳鏈接(直連)能夠省略
vip 192.168.1.182 用於提供應用程序B掛載服務
環境的實施是創建在高可用之上,c++

1.1.2 Haproxy 負載算法git

Haproxy有8種負載均衡算法(balance),分別以下:github

1.roundrobin(rr) # 動態加權輪詢 支持權重,web

2.static-rr # 靜態輪詢 不支持權重,建議使用

3.leastconn # 最小鏈接優先處理,建議使用

4.source # 源地址哈希算法,建議使用

  1. uri # 根據URI作哈希算法

  2. url_param,# 根據請求的URl參數'balance url_param' requires an URL parameter name作哈希

  3. hdr(name) # 根據HTTP請求頭來鎖定每一次HTTP請求

  4. rdp-cookie(name) # 根據據cookie(name)來鎖定並哈希每一次TCP請求

1.2 Haproxy 安裝

官網:https://github.com/haproxy/haproxy/releases

歷史版本:
on 25 Nov 2016
v1.8-dev0 …
0e658fb zip tar.gz
on 25 Nov 2016
v1.7.0 …
e59fcdd zip tar.gz
on 10 Nov 2016
v1.7-dev6 …
d5d890b zip tar.gz

yum install gcc gcc-c++ -y

  1. 開啓系統轉發
    vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.ipv4.ip_nonlocal_bind = 1 # 開啓vip忽略
    sysctl -p

  2. 源碼編譯
    tar xf haproxy-1.8.tar.gz;cd haproxy-1.8
    make TARGET=linux2628 PREFIX=/usr/local/haproxy
    make install prefix=/usr/local/haproxy

# ARCH系統版本架構uname -r
注 1.7版本報錯,安裝1.8正常
TARGET=參數能夠在安裝目錄下README文件中有解釋
less haproxy-1.7-dev0/README

1.3 Haproxy 環境配置和配置文件

  1. 配置日誌rsyslog.conf
    vi /etc/rsyslog.conf
    $ModLoad imudp
    $UDPServerRun 514
    local0.* /var/log/haproxy.log

  2. 手動建立目錄

cd /usr/local/haproxy/
mkdir -p bin conf logs var/run var/chroot

├── bin
├── conf
├── doc
├── logs
├── sbin
│ └── haproxy
└── var
├── chroot
└── run

  1. 拷貝配置文件haproxy.cfg

cd haproxy-1.8-dev0c
cp examples/haproxy.cfg /usr/local/haproxy/conf/

  1. 修改haproxy配置文件

global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
log loghost local0 info
maxconn 1000
user haproxy
group haproxy
daemon
quiet
pidfile /usr/local/haproxy/conf/haproxy.pid
spread-checks 3
nbproc 8

defaults
log global
mode http
# 不記錄健康檢查的日誌
retries 3
# 連次失敗3次T除
timeout connect 5000
timeout client 50000
timeout server 50000

listen admin_stats
bind 192.168.136.250:80
option httplog
maxconn 10
stats enable
stats refresh 30s
stats uri /admin?stats 狀態頁
stats realm XingCloud\ Haproxy
stats auth admin:admin
stats hide-version
stats admin if TRUE
cookie SERVERID insert indirect nocache

backend www.a.com
mode http
balance roundrobin
#server server1 192.168.136.135:80 cookie app1inst1 check inter 2000 rise 2 fall 5
#server server2 192.168.136.136:80 cookie app1inst2 check inter 2000 rise 2 fall 5
server server1 192.168.136.135:80 check port 22 inter 5000 fall 5
server server2 192.168.136.136:80 check port 22 inter 5000 fall 5

1.4 Haproxy 日誌配置+rsyslog服務

Centos 5.8
vim /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0 -r -x"

Centos 6

  1. 添加參數
    vim /usr/local/haproxy/conf/haproxy.cfg
    log 127.0.0.1:514 local0 warning

  2. 開啓端口
    vim /etc/rsyslog.conf
    取消註釋 開啓端口,添加日誌文件路徑
    $ModLoad imudp
    $UDPServerRun 514
    local0.* /usr/local/haproxy/logs/haproxy.log

 啓動rsyslog服務(默認已開機啓動)
/etc/init.d/rsyslog restart

日誌文件

配置中定義的日誌文件 /usr/local/haproxy/logs/haproxy.log
系統日誌文件 /var/log/message

1.5 Haproxy 配置文件詳解
1.5.1 global 全局配置

主要控制haproxy啓動前的進程及相關設置

global
log 127.0.0.1 local0 # 未定義日誌級別,記錄全部日誌
log 127.0.0.1:514 local1 notice #定義haproxy日誌級別[error warringinfo debug] 經過syslog服務處理
daemon # 之後臺形式運行harpoxy
nbproc 1 # 設置進程數量 設置過程數時,該值的設置應該和服務器的核心數一致
pidfile /usr/local/haproxy/conf/haproxy.pid #haproxy 進程PID文件
ulimit-n 819200 # ulimit 的數量限制
maxconn 4096 #默認最大鏈接數,需考慮ulimit-n限制
chroot /usr/local/haproxy/var/chroot # chroot運行路徑
uid/user 99/haproxy #運行haproxy 用戶或UID
gid/group 99/haproxy #運行haproxy 用戶組或gid
debug #haproxy 調試級別,建議只在開啓單進程的時候調試
spread-checks 3 # 健康檢查間隔時間
quiet # 安靜模式,啓動時無輸出
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin # 開啓socket支持
stats timeout 2m
1.5.2 default 默認配置

若是frontend backend listen段未設置,則默認使用defaults段的設置

defaults
log global
mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
option httplog #日誌類別,採用httplog
option dontlognull #不記錄健康檢查日誌信息
retries 2 #兩次鏈接失敗就認爲是服務器不可用,也能夠經過後面設置
option forwardfor #若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從Http Header中得到客戶端ip
option httpclose #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現
#option redispatch #當serverId對應的服務器掛掉後,強制定向到其餘健康的服務器,之後將不支持
option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接
maxconn 4096 #默認的最大鏈接數
timeout connect 5000ms #鏈接超時
timeout client 30000ms #客戶端超時 (根據客戶的習慣,通常設置在20-30s之間)
timeout server 30000ms #服務器超時 (後端服務器的超時之和不要大於客戶訪問的超時時間)
#timeout check 2000 #心跳檢測超時
#timeout http-keep-alive10s #默認持久鏈接超時時間
#timeout http-request 10s #默認http請求超時時間
#timeoutqueue 1m #默認隊列超時時間
balance roundrobin #設置默認負載均衡方式,輪詢方式
#balance source # 設置默認負載均衡方式,相似於nginx的ip_hash
#balnace leastconn #設置默認負載均衡方式,最小鏈接數

1.5.3 listen 統計頁面

listen admin_stats #設置Frontend和Backend的組合體,監控組的名稱,按須要自定義名稱
bind 0.0.0.0:1080 # 監控網卡地址 0.0.0.0或* 表明監控全部
mode http #http的7層模式
option httplog #採用http日誌格式
option forwardfor #記錄客戶端真實IP
cookie SERVERID insert indirect
timeout server 15s
timeout connect 15s
#log 127.0.0.1 local0 err #錯誤日誌記錄
maxconn 10 #默認的最大鏈接數
stats enable # 開啓狀態
stats refresh 30s #統計頁面自動刷新時間
stats uri /stats #統計頁面url
stats realm XingCloud\ Haproxy #統計頁面密碼框上提示文本
stats auth admin:admin #設置監控頁面的用戶和密碼:admin,能夠設置多個用戶名
stats auth Frank:Frank #設置監控頁面的用戶和密碼:Frank
stats hide-version #隱藏統計頁面上HAProxy的版本信息
stats admin if TRUE #設置手工啓動/禁用,後端服務器(haproxy-1.4.9之後版本)
balance roundrobin # 負載均衡策略
server web01 192.168.137.101:80 check port 2000 fall 3
server web02 192.168.137.102:80 check port 2000 fall 3

########設置haproxy 錯誤頁面#####

errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
errorfile 504 /home/haproxy/haproxy/errorfiles/504.http

1.5.4 frontend 前端配置

用來匹配接收客戶請求域名,URI等,並針對不一樣的區配,作不一樣的請求處理

bind 10.204.3.250:80 #VIP
#這裏建議使用bind *:80的方式,要否則作集羣高可用的時候有問題,vip切換到其餘機器就不能訪問了。
acl web hdr(host) -i www.abc.com
#acl後面是規則名稱,-i是要訪問的域名,
acl img hdr(host) -i img.abc.com
若是訪問www.abc.com這個域名就分發到下面的webserver 的做用域。
#若是訪問img.abc.com.cn就分發到imgserver這個做用域。
use_backend www.abc.com if web
use_backend img.abc.com if img

實例
acl is_www.wugk1.com hdr_end(host) -i wugk1.com
acl is_www.wugk2.com hdr_end(host) -i wugk2.com
use_backend www.wugk1.com if is_www.wugk1.com
use_backend www.wugk2.com if is_www.wugk2.com
default_backend www.wugk1.com

再定義段
Backend www.wugk1.com

1.5.5 backend 後端配置

定義後端服務集羣,以及對後端服務器的一些權重,隊列,鏈接數等選項的設置

backend www.abc.com # webserver做用域 可使用域名的方式 www.a.com
mode http
balance roundrobin # #負載均衡算法 banlance roundrobin 輪詢,
balance source 保存session值,支持static-rr,leastconn,first,uri等參數
(共有8中算法:'roundrobin'簡單的輪詢static-rr根據權重leastconn最少鏈接者先處理ource根據請求源IP 'uri'根據請求的URI url_param 根據請求的URl參數hdr(name)根據HTTP請求頭來鎖定每一次HTTP請求'rdp-cookie(name)'很據cookie(name)來鎖定並哈希每一次TCP請求)
健康檢查
option httpchk /index.html HTTP/1.0 # 健康檢查 針對站點文件檢查 排除端口 等同於
curl http://www.a.com/index.html的測試結果
#檢測文件,若是分發到後臺index.html訪問不到就再也不分發給它

option httpchk GET /index.html # 健康檢查 GET方法 對文件檢查

option httpchk # 健康檢查 至關於option / HTTP/1.0 不經常使用

基於域名的健康檢查

option httpchk HEAD /index.html HTTP/1.1\r\nHOST:\www.a.com
option httpchk GET /index.html HTTP/1.1\r\nHOST:\www.a.com

server  web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3  
server  web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3  backup

backend img.abc.com
mode http
option httpchk /index.php
balance roundrobin
server img01 192.168.137.101:80 check inter 2000 fall 3
server img02 192.168.137.102:80 check inter 2000 fall 3

參數詳解:

check port 22能夠簡寫成check 默認取前面端口

# inter 5000 fall 5 每5秒檢查一次,總共檢查5次 不添加默認爲間隔2秒,共3次
# -rise 2 恢復前檢查2次OK,加入提供服務
# weight 權重
# maxconn 2048 最大併發量
# cookie 1表示serverid爲1,check inter 1500 是檢測心跳頻率 

backup 備用節點,不提供服務,當全部節點宕機才提供服務,通常是生產中某臺提供其它服務的服務器能作,應急

option allbackups 全部備機一塊兒啓動 多臺備機的狀況下

配置實例1: 若是是https:加密站點

須要在:
global
maxsslconn 455350 #ssl最大鏈接數
tune.ssl.default-dh-param 2048 #採用2048位加密
frontend http-in
bind:443 ssl crt /etc/pki/tls/certs/haproxy.pem #在開放一個加密端口號和ssl加密證書的路徑(在/etc/pki/tls/certs下makehaproxy.pem可生成一個安全證書)
haproxy rsyslog日誌存儲(http和httpd都得用,方便之後的排錯)
vim /etc/rsyslog.conf #修改此配置文件
$ModLoadimudp
$UDPServerRun514
$AllowedSenderUDP, 127.0.0.1
.info;mail.none;authpriv.none;cron.none;local2.none #粗的是新加的/var/log/messages
local2.* /var/log/haproxy.log
service rsyslog restart #重啓日誌
service haproxy restart #重啓haproxy服務

配置實例2: 代理tcp的90端口轉發後端80端口

########tcp配置#################
listen test1
bind 0.0.0.0:90
mode tcp
option tcplog #日誌類別,採用tcplog
maxconn 4086
#log 127.0.0.1 local0 debug
server s1 10.18.138.201:80 weight 1
server s2 10.18.102.190:80 weight 1
server s2 10.18.102.190:22 weight 1 #不只僅只限80 8080 也能夠是22 23等其它tcp端口

1.6 Haproxy 啓動
啓動haproxy
-f 指定配置文件
-c 檢查語法
-D 啓動進程
-q 不顯示提示信息
-p pid文件

配置檢測
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c

啓動
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -D

平滑重啓
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg –sf cat ../haproxy.pid

中止
Kill cat /usr/local/haproxy /haproxy.pid

【注意】
Haproxy在本地要起一個VIP,可是網卡上沒有真實VIP地址,啓動的時候會報錯,因此要修改內核參數忽略檢查VIP地址

1.7 Haproxy 狀態頁

根據如下參數配置,訪問狀態頁
stats uri / admin?stats #統計頁面url
stats auth admin:admin #用戶名和密碼

若是監控端口不是默認的80,須要加端口的方式,/後面可自定義。
http://10.204.3.21:8000/admin?stats

1.8 Haproxy 動態管理

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
stats timeout 2m

socat工具,與haproxy.sock通訊管理haproxy

yum install socat -y

顯示幫助命令
echo "help" |socat stdio /var/lib/haproxy/haproxy.sock

help的位置能夠寫各類命令,例如:echo "show info" 將echo的輸出傳參給socat命令處理

也能夠經過這種方式監控haproxy

關閉指定後端節點服務器web01
echo "disable server backend-name web01" |socat stdio /var/lib/haproxy/haproxy.sock

這裏要指定backend的名稱,再指定服務器名,咱們在狀態頁也能夠看到backed名稱

1.9 haproxy 管理與配置

1.9.1 haproxy 健康檢查
httpchk格式:
option httpchk
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>

Enable HTTP protocol to check on the servers health
May be used in sections : defaults | frontend | listen | backend
yes | no | yes | yes
method: GET
參考資料:less /haproxy-1.8-dev0/doc/configuration.txt

option httpchk /index.html HTTP/1.0 # 健康檢查 針對站點文件檢查 排除端口 等同於
curl http://www.a.com/index.html的測試結果
#檢測文件,若是分發到後臺index.html訪問不到就再也不分發給它

option httpchk GET /index.html # 健康檢查 GET方法 對文件檢查

option httpchk # 健康檢查 至關於option / HTTP/1.0 不經常使用

基於域名的健康檢查

option httpchk HEAD /index.html HTTP/1.1\r\nHOST:\www.a.com
option httpchk GET /index.html HTTP/1.1\r\nHOST:\www.a.com

【注意】
健康檢查最好是由開發給出指定URI,由於這也是推鍋的一種手段,由於一旦健康檢查出問題沒法有效檢查,那能夠說是開發給的文件有問題,要作健康檢查的URI,必須考慮如下問題
機房緩存—》靜態面頁動態頁面redis緩存數據庫

1.9.2 haproxy 實現301跳轉 (redirect 重定向)
在frontend段添加acl規則
acl 51cto hdr(host) -i www.baidu.com
redirect prefix http://www.51cto.com

【實驗說明】
若是是在win的管理機上作測試,要先修改host文件的映射,把百度映射到你的haproxy服務器上,
實現的功能主要是當訪問公司某個頁面時,讓他跳轉到另外一個頁面,也能夠作優雅切換之類的

1.9.3 Haproxy 日誌記錄真實客戶端IP

  1. 在haproxy服務器的配置文件的listen段加添參數

option forwardfor # 開啓此功能

  1. 在後端節點服務器上,配置日誌格式
    例如:httpd.conf nginx.conf中定義日誌格式

LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" " forward

1.9.4 Haproxy 高可用參數backup
場景1: 當全部節點都失效時,自動啓動1臺備機 另1臺備機仍然閒置

server web1 10.16.0.9:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3
server web2 10.16.0.10:80 cookie 2 weight 3 check port 80 inter 2000 rise 2 fall 3
server web3 10.16.0.11:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup
server web4 10.16.0.12:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup

場景2:當全部節點失效時,自動啓動全部備機,須要添加option allbackup參數生效

option allbackup
server web1 10.16.0.9:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3
server web2 10.16.0.10:80 cookie 2 weight 3 check port 80 inter 2000 rise 2 fall 3
server web3 10.16.0.11:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup
server web4 10.16.0.12:80 cookie 1 weight 5 check port 80 inter 2000 rise 2 fall 3 backup

場景3:當1個節點失效時,就自動啓動1個備節點

此方案暫時沒有解決方案

1.9.5 Haproxy 高可用備節點bind沒法綁定的處理方法
[ALERT] 085/171635 (23522) : Starting proxy hdbattery: cannot bind socket [10.204.3.250:8000]
問題描述: 主節點已經分配了VIP,正常啓動,備節點由於沒有VIP,啓動時提示沒法bind
解決方法: 經過修改內核參數來開啓容許綁定非本機的IP
vi /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
sysctl -p

1.9.6 haproxy 互爲主備或多VIP業務場景

在配置文件中,配置多個listen段並bind多個VIP就能夠了,儘可能將listen的參數寫入defautl段中,這樣能夠減小維護

【配置步驟】
配置好內核參數,忽略bind net.ipv4.ip_nonlocal_bind = 1 開啓容許綁定非本機的IP
互爲主備的環境下,共有二個VIP,主綁一個VIP-1,同時綁一個VIP-2 可是VIP-2在主機上不存在
備綁定一個VIP-2 同時綁定一個VIP-1,可是VIP-1不存在

1.10 Haproxy ACL規則匹配

acl <aclname> <criterion> [flags] [operator] <value> ...
Declare or complete an access list.
May be used in sections : defaults | frontend | listen | backend
no | yes | yes | yes
Example:
acl invalid_src src 0.0.0.0/7 224.0.0.0/3
acl invalid_src src_port 0:1023
acl local_dst hdr(host) -i localhost
block if !invalid_src # block拒絕鏈接

【注意】 ACL 名稱能夠重複定義
1.10.1 基於ACL其於URI的跳轉

acl web_a hdr(host) –i www.baidu.com
acl web_b hdr(host) –i map.baidu.com
use_backend www if web_a
use_backend map if web_b
default_backend www

【實例講解】

  1. 當用戶輸入的域名是www.baidu.com時,就跳轉到後端地址池中的名爲www的池定義的服務器
  2. 當用戶輸入的域名是map.baidu.com時,就跳轉到後端地址池中的名爲map的池定義的服務器
  3. 當用戶輸入的域名沒有匹配到上面的acl,就默認走www的池

企業案例:參考老男孩架構課haproxy 2 38課

1.10.2 基於acl實現URI地址目錄的跳轉
函數: path.beg 匹配跟徑開頭

acl img path.beg /images/
acl php path.beg /php/
use_backend nginx_img if img
use_backend nginx_php if php
default_backend nginx_php

backend nginx_img

mode http
    balance roundrobin  
    server  server2 10.204.3.23:80 check port 80 inter 5000 fall 5

backend nginx_php

mode http
    balance roundrobin  
    server  server2 10.204.3.24:80 check port 80 inter 5000 fall 5

【實例講解】
當用戶輸入的路徑是/images/時,就跳轉到後端nginx_img池中定義的服務器
當用戶輸入的路徑是/php/時,就跳轉到後端nginx_php池中定義的服務器
當用戶輸入的不包含上面路徑時,默認走nginx_php

【環境搭建】

  1. 在3.23服務器上的發佈目錄中,建立/images/index.html文件
  2. 在3.24服務器上的發佈目錄中,建立/php/index.html文件
  3. 分別配置acl規則,訪問/images/index.html文件的,走nginx_img這個池
  4. 訪問/images/index.html文件的,走nginx_php這個池

1.10.3 基於擴展名作動靜分離
函數: Path_end 匹配路徑結尾

acl img path.beg .jpg .gif
acl php path.beg .html .txt .css
use_backend nginx_img if img
use_backend nginx_php if php
default_backend nginx_php

backend nginx_img

mode http
    balance roundrobin  
    server  server2 10.204.3.23:80 check port 80 inter 5000 fall 5

backend nginx_php

mode http
    balance roundrobin  
    server  server2 10.204.3.24:80 check port 80 inter 5000 fall 5

實驗環境和上面同樣,兩臺server創建相同的文件,經過識別擴展名自動分配後端節點

1.10.4 基於user_agent客戶端作跳轉
在日誌中,記錄中用戶的IP和客戶端類型,能夠在日誌中找到對應的客戶端類型作匹配

acl iphone_user hdr_sub(user-agent) -i iphone
redirect prefix http://iphone.baidu.com if iphone_user #redirect方式跳轉
use_backupend iphone if iphone_user # 跳轉到後端backend池

測試實例:
acl img hdr_sub(user-agent) -i QQBrowser
redirect prefix http://www.qq.com if img

acl php hdr_sub(user-agent) -i Chrome
    redirect  prefix  http://www.51cto.com if php

    acl windows hdr_sub(user-agent) -i windows
    use_backend 3-23 if windows

1.10.5 基於IP和端口控制過濾

acl invalid_src  src          0.0.0.0/7 224.0.0.0/3
    acl invalid_src  src_port     0:1023
    acl local_dst    hdr(host) -i localhost
    block if invalid_src || local_dst

acl invalid_src src 192.168.1.0/24 # 網段
acl invalid_src src_port 0:1024
acl local_dst hdr(host) –i localhost
block if !invalid_src # 拒毫不是來自上面規則的

實例: 針對IP作跳轉
acl badguy1 src 10.204.3.17
use_backend 3-24 if badguy1

acl badguy src 10.204.1.245
use_backend 3-23 if badguy

1.11 Haproxy+Keepalived+nginx 架構

1.11.1 系統環境:
系統版本:CentOS6.0 x86_64
HAProxy版本:1.4.21
Keepalived版本:1.2.1
Nginx版本:1.2.2
MASTER_IP:192.168.0.130
BACKUP_IP:192.168.0.131
VIP:192.168.0.133
WEB_1:192.168.0.134
WEB_2:192.168.0.135

1.11.2 HAProxy安裝:
haproxy.cfg內容以下:
######### haproxy.cfg ######################
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
uid 99
gid 99
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000

frontend http-in
bind *:80
acl is_www.wugk1.com hdr_end(host) -i wugk1.com
acl is_www.wugk2.com hdr_end(host) -i wugk2.com
use_backend www.wugk1.com if is_www.wugk1.com
use_backend www.wugk2.com if is_www.wugk2.com
default_backend www.wugk1.com

backend www.wugk1.com
balance roundrobin
cookie SERVERID insert nocache indirect
option httpchk HEAD /index.html HTTP/1.0
option httpclose
option forwardfor
server Server1 192.168.33.11:80 cookie Server1
backend www.wugk2.com
balance roundrobin
cookie SERVERID insert nocache indirect
option httpchk HEAD /index.html HTTP/1.0
option httpclose
option forwardfor
server Server1 192.168.33.11:81 cookie Server1
#########################################################

而後啓動haproxy,以下執行啓動命令:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg

錯誤提示:
[WARNING] 217/202150 (2857) : Proxy 'chinaapp.sinaapp.com': in multi-process mode, stats will be limited to process assigned to the current request.
會提示如上信息,nbproc進程若是設置爲1則不會提示,若是想去掉這個提示能夠修改編譯文件便可。 在源碼配置src/cfgparse.c找到以下行

if (nbproc > 1) {
if (curproxy->uri_auth) {

  • Warning("Proxy '%s': in multi-process mode, stats will be limited to process assigned to the current request.\n",
  • Warning("Proxy '%s': in multi-process mode, stats will be limited to the process assigned to the current request.\n",
    調整nbproc > 1數值便可。

1.12 Haproxy+heartbeat+nginx 架構

……..配置此處省略……….

1.13 LVS+haproxy 4層與7層分開控制

  1. 爲了性能考慮,4層與7層分開,減小資源消耗
  2. Haproxy能夠支持多臺,可橫向增長100臺以上,易擴展

1.14 Haproxy 故障排除

1.14.1 故障: make: [install-doc] 錯誤 1install: 沒法獲取"doc/haproxy-en.txt" 的文件狀態(stat): 沒有那個文件或目錄install: 沒法獲取"doc/haproxy-fr.txt" 的文件狀態(stat): 沒有那個文件或目錄make: [install-doc] 錯誤 1