反向代理服務器功能:web緩存(加速)、反向代理、內容路由(根據流量及內容類型等將請求轉發至特定服務器)、轉碼器javascript
緩存:減小冗餘內容傳輸;節省帶寬、緩解網絡瓶頸;下降了對原始服務器的請求壓力;下降了傳輸延遲,公共緩存每一個人均可以使用,帶有敏感數據的私有緩存則只對限定某類或某我的使用css
nginx可實現緩存功能,haproxy不能實現緩存功能,這裏只說明其反向代理功能和負載均衡功能前端
yum install haproxy 主配置文件haproxy.cfg 開啓日誌功能: 編輯/etc/rsyslog.conf文件 $ModLoad imudp $UDPServerRun 514 #開啓udp514端口 local2.* /var/log/haproxy.log 編輯/etc/haproxy/haproxy.cfg文件: log 127.0.0.1 local2 配置負載均衡後端主機: global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 定義面向客戶端的總的最大鏈接數(面向客戶端那一面) user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main *:80 #第一種方式 # bind *:80 #第二種方式 # bind *:8080 #只能用於frontend, listen; # maxconn 也能夠定義在這裏或listen後,定義了單個實例的最大併發鏈接數,若是在global段定義就是全部實例總的 default_backend websrvs #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend websrvs balance roundrobin server web1 192.168.20.7:80 check #定義的名字web1會被加到請求首部發到後端,當後端有虛擬主機時頗有用 server web2 192.168.20.8:80 check
balance: 指明調度算法;幾種調度算法:java
動態:權重可動態調整
靜態:調整權重不會實時生效
roundrobin: 輪詢,動態算法,每一個後端主機最多支持4128個鏈接;
static-rr: 輪詢,靜態算法,每一個後端主機支持的數量無上限;
leastconn: 根據後端主機的負載數量進行調度;僅適用長鏈接的會話;動態;
hash-type:
map-based:取模法;靜態;
consistent:一致性哈希法;動態;node
下面的四種調度算法都基於上面的兩種hash-typenginx
source:
uri:對uri的左半部分(?標記以前的部分)或者整個uri作hash,除之後端服務器總權重後綁定到後端服務器
url_param: 根據url中的指定的參數的值進行調度;把值作hash計算,併除以總權重;
hdr(<name>) :根據請求報文中指定的header(如use_agent, referer, hostname)進行調度;把指定的header的值作hash計算得值除以總權重;
示例:web
backend websrvs balance hdr(User-Agent) hash-type consistent server web1 192.168.20.7:80 check server web2 192.168.20.8:80 check
測試:算法
mode: 健康狀態檢測時基於何種協議
HAProxy的工做模式;默認爲tcp;有三種:tcp, http, healthapache
只有客戶端和前端,後端都是用http通訊才能夠使用http模式後端
在front段也能夠指定log:
frontend main *:80 log global log 127.0.0.2 local3
使用use_backend 和acl定義後段
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
server段後可加的參數:
backup:設定爲備用服務器,僅在負載均衡場景中的其它server均不可用於啓用此server; check:啓動對此server執行健康狀態檢查,其能夠藉助於額外的其它參數完成更精細的設定,如: inter <delay>:設定健康狀態檢查的時間間隔,單位爲毫秒,默認爲2000;也能夠使用fastinter和downinter來根據服務器端狀態優化此時間延遲; rise <count>:設定健康狀態檢查中,某離線的server從離線狀態轉換至正常狀態須要成功檢查的次數; fall <count>:確認server從正常狀態轉換爲不可用狀態須要檢查的次數; cookie <value>:爲指定server設定cookie值,此處指定的值將在請求入站時被檢查,第一次爲此值挑選的server將在後續的請求中被選中,其目的在於實現持久鏈接的功能; maxconn <maxconn>:指定此服務器接受的最大併發鏈接數;若是發往此服務器的鏈接數目高於此處指定的值,其將被放置於請求隊列,以等待其它鏈接被釋放; maxqueue <maxqueue>:設定請求隊列的最大長度; observe <mode>:經過觀察服務器的通訊情況來斷定其健康狀態,默認爲禁用,其支持的類型有「layer4」和「layer7」,「layer7」僅能用於http代理場景; redir <prefix>:啓用重定向功能,將發往此服務器的GET和HEAD請求均以302狀態碼響應;須要注意的是,在prefix後面不能使用/,且不能使用相對地址,以避免形成循環;例如: server srv1 172.16.100.6:80 redir http://imageserver.magedu.com check weight <weight>:權重,默認爲1,最大值爲256,0表示不參與負載均衡;
option httpchk option httpchk <uri> option httpchk <method> <uri> 例如: backend https_relay mode tcp option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.lee123.com server apache1 192.168.1.1:443 check port 80 使用案例: server first 172.16.100.7:1080 cookie first check inter 1000 server second 172.16.100.8:1080 cookie second check inter 1000
基於瀏覽器cookie實現session sticky:定義健康檢查方式能夠使用option:
要點: (1) 每一個server有本身唯一的cookie標識; (2) 在backend中定義爲用戶請求調度完成後操縱其cookie backend websrvs balance roundrobin cookie SERVERID insert nocache indirect server web1 192.168.20.7:80 check cookie websrv1 server web2 192.168.20.8:80 check cookie websrv2
開啓統計頁面:
listen statistics bind *:9090 stats enable stats hide-version #stats scope . stats uri /haproxyadmin?stats stats realm "HAPorxy\ Statistics" stats auth admin:mageedu stats admin if TRUE
向日志中記錄額外信息:
capture request header
capture response header
當mode爲http時,記錄豐富的日誌信息:
option httplog----默認是開啓的
錯誤頁面重定向:
errorfile: 使用haproxy主機本地文件進行響應;
errorloc, errorloc302: 使用指定的url進行響應,響應狀態碼爲302;不適用於GET之外的其它請求方法;
errorloc303:返回303狀態碼;
添加請求或響應報文首部:
reqadd
rspadd
frontend main bind *:80 bind *:8080 rspadd Via:\ node1.lee.com default_backend websrvs
動靜分離的示例: frontend main bind *:80 bind *:8080 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend appsrvs #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static balance roundrobin server static1 192.168.20.7 check server static2 192.168.20.8 check backend appsrvs balance roundrobin option forwardfor except 127.0.0.1 header X-Client option httpchk cookie SERVERID insert indirect nocache server web1 192.168.20.7:80 check cookie web1 server web2 192.168.20.8:80 check cookie web2