1、haproxy和nginx的區別javascript
Haproxy的工做模式:代理模式爲http和tcp作代理,能夠爲多種服務作代理,它是一個專門的代理服務器,本身不能成爲web服務。
php
nginx的工做模式:web模式和代理,Nginx只爲WEB服務作代理。
css
2、安裝配置html
一、安裝
前端
# yum -y install haproxy
注意,若是在生產中安裝,必定要注意安裝軟件的版本要落後最新版本一到兩個,不然,新版本中出現了bug沒法解決將是致命的。java
二、配置詳解
node
************************全局配置*****************************
linux
Global log 127.0.0.1 local2 # 定義全局日誌服務器 chroot /var/lib/haproxy # 修改haproxy的工做目錄到制定的目錄,提升安全性 pidfile /var/run/haproxy.pid # pid文件位置 maxconn 4000 # 最大鏈接數 user haproxy # 服務運行時的身份,也能夠用uid來表示 group haproxy # 服務運行時的身份所屬的組,能夠用gid來表示 Daemon # 服務以守護進程的身份運行 # turn on stats unix socket # 默認打開UNIX socket stats socket /var/lib/haproxy/stats # 指明unix socket 所在的位置 Node www.a.com # 定義當前節點的名稱,用於HA場景中多haproxy進程共享同一個IP地址時 ulimit-n 100 # 設定每進程所可以打開的最大文件描述符數目,默認狀況下其會自動進行計算,所以不推薦修改此選項
log
127.0
.
0.1
local2要想啓用,能夠看到默認配置文件中有這麼一行註釋
nginx
#local2.*/var/log/haproxy.log
web
作以下配置便可啓用
# touch /var/log/haproxy.log # vim /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514 # service rsyslog restart # tail -f /var/log/haproxy.log Oct 6 10:45:22 localhost haproxy[22208]: 172.16.5.200:50332 [06/Oct/2013:10:45:22.852] web static/www.web1.com 6/0/2/4/32 200 45383 - - ---- 3/3/0/1/0 0/0 "GET / HTTP/1.1"
顯示了客戶端ip和realserver主機名等信息
**********************默認配置*********************************
defaults mode http # 爲http服務代理,http爲7層協議,tcp4層 log global # 全局日誌 option httplog # 日誌類別爲http日誌格式 option dontlognull # 不記錄健康查詢的日誌 #########健康情況檢測的意義在於,後端服務器若掛掉了,就不會再向它發送請求信息。 option http-server-close # 每次請求完後主動關閉http通道,支持客戶端長鏈接 option forwardfor except 127.0.0.0/8 # 若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從http header中得到客戶端ip option redispatch #serverid對應的服務器掛掉後,強制定向到其餘健康的服務器 retries 3 #3次鏈接失敗就認爲服務不可用,也能夠經過後面設置 timeout http-request 10s # 請求超時間 timeout queue 1m # 排隊超時 timeout connect 10s # 鏈接超時 timeout client 1m # 客戶端超時 timeout server 1m # 服務器端超時 timeout http-keep-alive 10s # 保持鏈接超時 timeout check 10s # 健康檢測超時 maxconn 3000 # 每一個進程最大鏈接數,能夠在global中配置
************************前端代理配置******************************
frontend main *:5000 # 前端定義服務器名稱和端口 acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app 定義訪問控制,若是符合 url_static,就代理到static,若是不是url_static,就使用默認的後端服務
***********************後端服務器配置*****************************
backend static balance roundrobin #負載均衡調度算法 server static 127.0.0.1:4331 check # 定義了一個後端服務器並作健康情況檢測 backend app balance roundrobin server app1 127.0.0.1:5001 check rise 2 fall 1 server app2 127.0.0.1:5002 check rise 2 fall 1 server app3 127.0.0.1:5003 check rise 2 fall 1 server app4 127.0.0.1:5004 check rise 2 fall 1 # check rise 2 fall 1 健康情況檢查,rise表示後端realserver從stop到start檢查的次數,fall表示從start到stop檢查的次數
3、實例配置
本機ip:172.16.5.16
開啓forward轉發功能
#sysctl-wnet.ipv4.ip_forward=1
關閉防火牆
爲後端ip:172.16.6.1作代理
爲後端服務器提供頁面並啓動httpd
# vim /var/www/html/index.html <h1>welcome!</> # service httpd start 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 #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 header X-Forward-For # 後端服務器日誌中記錄遠程客戶端ip,別忘了在後端服務器上修改log格式 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend web bind *:80 default_backend static 也能夠寫成 frontend web 172.16.5.16:80 dfault_backend static #--------------------------------------------------------------------- # static backend for serving up p_w_picpaths, stylesheets and such #--------------------------------------------------------------------- backend static server www.web1.com 172.16.6.1:80 check stats enable # 開啓服務器狀態信息 stats hide-version # 隱藏版本信息 stats realm haproxy\ stats # 說明認證信息 \ 轉譯了一個空格 stats auth admin:admin # 認證用戶 stats admin if TRUE # 經過認證就容許管理 stats uri /abc # 自定義stats顯示頁面uri
效果圖
單獨使用一個端口來監聽stats狀態信息。
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 defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats bind *:1080 stats enable stats hide-version stats realm haproxy\ stats stats auth admin:admin stats admin if TRUE stats uri /abc frontend web bind *:80 default_backend static backend static server www.web1.com 172.16.6.1:80 check
效果圖:
4、負載均衡--調度算法
roundrobin動態支持權重和在服務器運行時調整,支持慢速啓動
static-rr靜態不支持在服務器運行時調整,不支持慢速啓動
leastconn最少鏈接,只建議使用很是長的會話
source:後端服務器時動態服務器時使用,相似於nginx的iphash
Hash-type:map-based靜態hash碼取餘計算ip的hash碼除以全部的服務器數,餘數得幾就放在第幾個服務器上
Hash-type:consistent動態一致性hashhash環
基於權重weight動態
uri根據用戶訪問的uri來負載均衡,它也有hash表,一樣有hash-type,第一次訪問的結果被負載到哪一個服務器,保存在了hash表中,在來訪問一樣的uri,就會始終到這臺服務器。
url_param根據用戶賬號信息,將請求發往同一個服務器,一樣有hash-type。
hdr:首部根據請求首部調度,一樣有hash-type
requestheader請求首部
reponseheader響應首部
hdr(hosts)格式
hdr(www.a.com)實例
一致性hash負載均衡
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats bind *:1080 stats enable stats hide-version stats realm haproxy\ stats stats auth admin:admin stats admin if TRUE stats uri /abc frontend web bind *:80 default_backend static backend static balance source hash-type consistent server www.web1.com 172.16.6.1:80 check weight 3 server www.web2.com 172.16.6.2:80 check weight 1
5、acl訪問控制
frontend web bind *:8080 default_backend static acl abc src 172.16.5.100 redirect prefix http://172.16.5.16/def if abc
當客戶端ip爲172.16.5.100時,重定向到http://172.16.5.16/def
acl要和redirectprefix或者redirectlocation搭配使用
官方實例,將用戶登陸後的url重定向到https安全鏈接。
acl clear dst_port 80 acl secure dst_port 8080 acl login_page url_beg /login acl logout url_beg /logout acl uid_given url_reg /login?userid=[^&]+ acl cookie_set hdr_sub(cookie) SEEN=1 redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set redirect prefix https://mysite.com if login_page !secure redirect prefix http://mysite.com drop-query if login_page !uid_given redirect location http://mysite.com/ if !login_page secure redirect location / clear-cookie USERID= if logout
訪問阻止
frontend web bind *:8080 default_backend static acl abc src 172.16.5.100 block if abc # 阻止訪問
修改原配置文件,實現動靜分離
frontend web bind *:80 acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets #字符形式 acl url_static path_reg -i ^/static ^/p_w_picpaths ^/javascript ^/stylesheets #正則表達式 acl url_static path_end -i .jpg .jpeg .gif .png .css .js #字符 acl url_static path_reg -i .jpg $.jpeg$ .gif $.png$ .css$ .js$ # 正則表達式 #通常能用字符,就不要用正則表達式,字符的比正則表達式快。 use_backend static_servers if url_static default_backend dynamic_servers backend static_servers balance roundrobin server imgsrv1 172.16.200.7:80 check maxconn 6000 server imgsrv2 172.16.200.8:80 check maxconn 6000 backend dynamic_servers balance source server websrv1 172.16.200.7:80 check maxconn 1000 server websrv2 172.16.200.8:80 check maxconn 1000 server websrv3 172.16.200.9:80 check maxconn 1000
haproxylisten配置示例:
listen webfarm bind 192.168.0.99:80 mode http stats enable stats auth someuser:somepassword balance roundrobin cookie JSESSIONID prefix option httpclose option forwardfor option httpchk HEAD /check.txt HTTP/1.0 server webA 192.168.0.102:80 cookie A check server webB 192.168.0.103:80 cookie B check
Haproxy綜合配置事例
global pidfile /var/run/haproxy.pid log 127.0.0.1 local0 info defaults mode http clitimeout 600000 srvtimeout 600000 timeout connect 8000 stats enable stats auth admin:admin stats uri/monitor stats refresh5s option httpchk GET /status retries5 option redispatch errorfile 503 /path/to/503.text.file balanceroundrobin# each server is used in turns, according to assigned weight frontend http bind :80 monitor-uri /haproxy # end point to monitor HAProxy status (returns 200) acl api1 path_reg ^/api1/? acl api2 path_reg ^/api2/? use_backend api1 if api1 use_backend api2 if api2 backend api1 # option httpclose server srv0 172.16.5.15:80 weight 1 maxconn 100 check inter 4000 server srv1 172.16.5.16:80 weight 1 maxconn 100 check inter 4000 server srv2 172.16.5.16:80 weight 1 maxconn 100 check inter 4000 backend api2 option httpclose server srv01 172.16.5.18:80 weight 1 maxconn 50 check inter 4000
6、結合keepalived作高可用代理
拓撲圖
規劃:
準備工做請參照以前寫的博客,無非就是時間同步,雙機互信,主機名稱可以互相解析。
node1:
ip:172.16.5.15
hostname:www.a.com
node2
ip:172.16.5.16
hostname:www.b.com
後端realserver讓別人代作
配置haproxy
node1:# yum -y install haproxy node2:# yum -y install haproxy # cd /etc/haproxy # mv haproxy.cfg haproxy.bak # vim haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 header X-Forward-For option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats #專門弄個端口進行狀態管理 bind *:1080 stats enable stats hide-version stats realm haproxy\ stats stats auth admin:admin stats admin if TRUE stats uri /abc frontend web bind *:80 acl danymic path_end -i .php acl abc src 172.16.5.100 block if abc use_backend php if danymic default_backend static backend static balance roundrobin server www.web1.com 172.16.5.16:8080 check rise 2 fall 1 weight 1 server www.web2.com 172.16.5.15:8080 check rise 2 fall 1 weight 1 backend php balance roundrobin server www.web3.com 172.16.6.1:80 check rise 2 fall 1 weight 1 server www.web4.com 172.16.6.2:80 check rise 2 fall 1 weight 1 # scp haproxy.cfg b:/etc/haproxy/
配置keepalived
node1
# yum -y install keepalived # cd /etc/keepalived/ # vim keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 1 weight 2 } #vrrp_script chk_mantaince_down { # script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" # interval 1 # weight 2 #} vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 5 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 11111 } virtual_ipaddress { 172.16.5.100/16 } track_script { chk_mantaince_down chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 11111 } virtual_ipaddress { 172.16.5.101/16 } track_script { chk_mantaince_down chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
該配置文件主要實現的功能:一、兩個實例VI,實現了雙主模型,主要爲前端dns負載均衡使用;二、單個主從模型能夠實現高可用,前提是如果針對某個服務,這個服務必須在keepalived啓動以前啓動,並且要對之監控;三、固然,也要作好對keepalived服務自己的監控,這就須要編輯另外的腳本,腳本所在的目錄必須與notify_master"/etc/keepalived/notify.shmaster"中提到的一致。
編寫對keepalived服務自己的監控腳本
# vim /etc/keepalived/notify.sh #!/bin/bash # Author: MageEdu <linuxedu@foxmail.com> # description: An example of notify script # vip=172.16.5.100 contact='root@localhost' Notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master /etc/rc.d/init.d/haproxy start exit 0 ;; backup) notify backup /etc/rc.d/init.d/haproxy restart exit 0 ;; fault) notify fault exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac
注意:本腳本中提到了vip,而本實驗是雙主模型,其中有兩個vip,若是想省事,就寫一個就好了,若是求精確,能夠複製這個腳本,修改vip而後在配置文件中修改另外一個實例中的notify.sh的路徑。
node2中也要這樣配置,不過要修改主從和優先級,這裏再也不羅嗦。
配置完以後,啓動了haproxy和keepalived以後,對配置作下校驗。
#service haproxy start #service keepalived start node1 # ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:a5:31:22 brd ff:ff:ff:ff:ff:ff inet 172.16.5.15/16 brd 172.16.255.255 scope global eth0 inet 172.16.5.101/16 scope global secondary eth0 inet6 fe80::20c:29ff:fea5:3122/64 scope link valid_lft forever preferred_lft forever node2 # ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:cc:55:6d brd ff:ff:ff:ff:ff:ff inet 172.16.5.16/16 brd 172.16.255.255 scope global eth0 inet 172.16.5.100/16 scope global secondary eth0 inet6 fe80::20c:29ff:fecc:556d/64 scope link valid_lft forever preferred_lft forever
驗證效果
###########################keepalived的雙主模型實現的負載均衡##################################
############################動靜分離之靜態頁面負載均衡############################
############################動靜分離之動態頁面負載均衡##############################
**************************************************************************************************訪問專門設定的用於查看代理狀態的頁面
**************************************************************************************************修改配置文件,將拒絕訪問的ip改成客戶端ip,獲得以下頁面
frontendweb
bind*:80
default_backendstatic
aclabcsrc172.16.5.200
blockifabc
172.16.5.200是我物理機的IP地址
以上總結,有不足之處,望指教。。