1. 程式人生 > >Linux Haproxy詳細配置教程

Linux Haproxy詳細配置教程

edi 服務器硬件 級別 時間 orf 根據 aid ket 動靜分離

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

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

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

Haproxy 工作在4層和7層,LVS工作在4層,naginx工作在7層,工作方式和nginx負載均衡相似,在配置文件中配置節點,然後通過算法輪詢,

HAproxy優點:
1、 HAProxy是支持虛擬主機的,可以工作在4、7層(支持多網段);
2、 能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作;
3、 支持url檢測後端的服務器;
4、 它跟LVS一樣,本身僅僅就只是一款負載均衡軟件;單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度,在並發處理上也是優於Nginx的;
5、 HAProxy可以對Mysql讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,HAProxy的支持多種算法。

1.1.1 Haproxy 解決方案拓撲圖

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下使用。

實施部署前主機規劃列表
名稱 接口 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掛載服務
環境的實施是建立在高可用之上,

1.1.2 Haproxy 負載算法

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

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

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] 錯誤 1
install: 無法獲取"doc/haproxy-en.txt" 的文件狀態(stat): 沒有那個文件或目錄
install: 無法獲取"doc/haproxy-fr.txt" 的文件狀態(stat): 沒有那個文件或目錄
make:
[install-doc] 錯誤 1

Linux Haproxy詳細配置教程