HAProxy的配置

HAProxy的配置

進程及安全管理:chroot, deamon,user,group,uid,gid
    nbproc <number> :要啓動的haproxy 的進程數量,系統默認單進程,要求使用daemon 模式
    ulimit-n <number> :每一個haproxy 進程可打開的最大文件數,系統自動會指定,不建議設置
    daemon:後端方式運行,建議使用
    log :定義全局的syslog 服務器,最多能夠定義兩個
        log <address> [len <length>] <facility> [max level [min level]]
    address:rsyslog 服務器地址
    len:記錄日誌的長度,默認我1024
日誌:
    log:
        log global
        log <address> [len <length>] <facility> [<level>[<minlevel>]]
        no log
        注意:
            默認發往本機的日誌服務器;
            (1) local2.* /var/log/local2.log
            (2) $ModLoad imudp
                $UDPServerRun 514
    log-format <string>:
        課外實踐:參考文檔實現combined
    將特定信息記錄在日誌中
        capture cookie <name> len <length>:
            捕獲求和響應報文中的 cookie 並記錄日誌
        capture request header <name> len <length>:
            捕獲請求報文中指定的首部並記錄日誌
            示例:
                capture request header X-Forwarded-For len 15
        capture response header <name> len <length>:
            捕獲響應報文中指定的首部並記錄日誌
            示例:
                capture response header Content-length len 9
                capture response header Location len 15
性能調整:
    maxconn <number>:
        設定每一個haproxy 進程所能接受的最大併發鏈接數
    maxconnrate <number>:
        設置每一個進程每秒種所能創建的最大鏈接數量
    maxsessrate <number>:
        設置每一個進程每秒種所能創建的最大會話數量
    maxsslconn <number>:  
        每進程支持SSL 的最大鏈接數量
    spread-checks <0..50, in percent> :
        健康檢測延遲時長比建議2-5
配置段
    代理配置段:
        - defaults <name>
        - frontend <name>
        - backend <name>
        - listen <name>
    Frontend 段:指定接收客戶端鏈接偵聽套接字設置
    Backend 段:指定將鏈接請求轉發至後端服務器的相關設置
    Listen 對段:指定完整的先後端設置,只對TCP有效
    proxy 名稱:使用「字母「,」數字」,「-」,「_」,「.」,「:」 並區分字符大小寫
配置參數:
    bind :指定一個或多個前端偵聽地址和端口
        bind [<address>]:<port_range> [, ...] [param*]
    示例:
        listen http_proxy
        bind :80,:443
        bind 10.0.0.1:10080,10.0.0.1:10443
        bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
Balance 配置
    balance :後端服務器組內的服務器調度算法
    balance <algorithm> [ <arguments> ]
    balance url_param <param> [check_post]
    調度算法:
        roundrobin :基於權重輪詢,動態算法, 支持權重在運行時調整,支持慢啓動,每一個後端backend 中最多支持4095 個server
            server options:weight #
        static-rr :基於權重輪詢,靜態算法,不支持權重在運行時調整及慢啓動,後端主機數量無上限
        leastconn :加權最少鏈接,動態算法,最少鏈接的後端服務器優先分配接收新鏈接,相同鏈接時輪詢,推薦在較長會話的場景使用 ,例如MySQL、LDAP 等,不適合http。
        first :根據服務器在列表中的位置,自上而下進行調度,前面服務器的鏈接數達到上限,新請求才會分配給下一臺服務
        source :源地址hash ,新鏈接先按權重分配,後續鏈接按source 分配請求
    uri:
        對URI 的左半部分或整個uri 作hash 計算,併除以服務器總權重取模,之後派發至某挑出的服務器, 適用於後端緩存服務器
            <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
        左半部分:/<path>;<params>
        整個uri :/<path>;<params>?<query>#<frag>
    url_param:
        對用戶請求的uri 中的<params> 部分中的參數的值做hash 計算,並由服務器總權重相除之後派發至某挑出的服務器,一般用於追蹤用戶,以確保來自同一個用戶的請求始終發往同一個Backend Server
    hdr(<name>) :
        對於每一個http 請求,此處由<name> 指定的http首部將會被取出作hash計算,並由服務器總權重相除之後派發至某挑出的服務器,無有效值的會被輪詢調度。
            hdr(Cookie)
    rdp-cookie 遠程桌面相關
    rdp-cookie(<name>)
哈希算法(hash)
    hash-type :
        hash-type <method> <function> <modifier>
        method:
            map-based :除權取餘法,哈希數據結構是靜態數組
            consistent :一致性哈希,哈希數據結構是一棵樹
            <function> :  哈希函數
                sdbm djb2 wt6
    default_backend <backend>
        無use_backend匹配時,使用默認的backend ,用於frontend中
    default-server [param*]
        爲backend 中的各server設定默認選項

後端配置:
    server <name> <address>[:[port]] [param*]
        定義後端主機的各服務器及其選項
        server <name> <address>[:port] [settings ...]
        default-server [settings ...]
        <name> :服務器在haproxy 上的內部名稱;出如今日誌及警告信息
        <address> :服務器地址,支持使用主機名
        [:[port]] :端口映射;省略時,表示同bind 中綁定的端口
        [param*] :參數
            weight <weight> :權重,默認爲1
            maxconn <maxconn> :當先後端server 的最大併發鏈接數
            backlog <backlog> :當server 的鏈接數達到上限後的後援隊列長度
            backup :設定當前server 爲備用服務器Sorry Server
健康狀態檢測
    check :對當前server 作健康狀態檢測,只用於四層檢測
        注意:httpchk,「smtpchk」, 「mysql-check」, 「pgsql-check」 和「ssl-hello-chk」  用於定義應用層檢測方法
        addr:檢測時使用的IP地址
        port:針對此端口進行檢測
        inter <delay> :檢測之間的時間間隔,默認爲2000ms
        rise <count> :連續多少次檢測結果爲「成功」才標記服務器爲可用;默認爲2
        fall <count> :連續多少次檢測結果爲「失敗」才標記服務器爲不可用;默認爲3
    disabled :標記爲不可用
    redir <prefix> :將發往此server 的全部GET 和HEAD 類的請求重定向至指定的URL
    對後端服務器作http 協議健康狀態檢測:一般用於bendend
        option httpchk 默認爲:/ OPTIONS HTTP/1.0
        option httpchk <uri>
        option httpchk <method> <uri>
        option httpchk <method> <uri> <version>
            定義基於http 協議的7 層健康狀態檢測機制
        http-check expect [!] <match> <pattern>
            http 協議健康 狀態檢測
    
cookie 配置
    cookie <value> :爲當前server 指定cookie 值,實現基於cookie 的會話黏性
    cookie <name> [ rewrite | insert | prefix ] [ indirect ][ nocache ] [ postonly ] [ preserve ] [ httponly ] [secure ] [ domain <domain> ]* [ maxidle <idle> ] [maxlife <life> ]
        <name>:cookie 名稱,用於實現持久鏈接
        rewrite :重寫
        insert :插入
        prefix:前綴
    示例:
        基於cookie 的session sticky 的實現:
        backend websrvs
            cookie WEBSRV insert nocache
            server srv1 172.16.100.6:80 weight 2 check rise 1 fall 2 maxconn 3000 cookie srv1
            server srv2 172.16.100.7:80 weight 1 check rise 1 fall 2 maxconn 3000 cookie srv2
統計接口啓用的相關參數
    stats enable
        啓用統計頁;基於默認的參數啓用stats page
            - stats uri : /haproxy?stats uri 默認值
            - stats realm : HAProxy\ Statistics
            - stats auth : no authentication
    stats uri <prefix>
        自定義stats page uri, 默認爲
    stats auth <user>:<passwd>
        認證時的帳號和密碼,可以使用屢次
    stats realm <realm>
        認證時的realm
    stats hide-version
        隱藏 版本
    stats refresh <delay>
        設定自動刷新時間間隔
    stats admin { if | unless } <cond>
        啓用stats page 中的管理功能
    配置示例:
        listen stats
            bind :9999
            stats enable
            stats realm HAPorxy\ Stats\ Page
            stats auth admin1:password1
            stats auth admin1:password2
            stats refresh 3s
            stats admin if TRUE
工做模式
    maxconn <conns> :爲指定的frontend 定義其最大併發鏈接數,默認爲3000
    mode { tcp|http|health }
        定義haproxy 的工做模式
        tcp :基於layer4 實現代理,可代理mysql, pgsql, ssh,ssl 等協議,https 時使用此模式,默認模式
        http :僅當代理協議爲http 時使用,centos 實際默認模式
        health :工做爲健康狀態檢查的響應模式,當鏈接請求到達時迴應「OK」
    tcp模式示例:
        listen ssh
            bind :22022
            balance leastconn
            mode tcp
            server sshsrv1 172.16.100.6:22 check
            server sshsrv2 172.16.100.7:22 check


forwardfor 配置
    option forwardfor [ except <network> ] [ header <name> ][ if-none ]
        在由haproxy 發日後端主機的請求報文中添加「X-Forwarded-For」 首部,其值爲前端客戶端的地址;用於向後端主發送真實的客戶端IP。
        [ except <network> ] :請求報文來自此處指定的網絡時不予添加此首部,如haproxy 自身所在網絡
        [ header <name> ] :使用自定義的首部名稱,而非「X-Forwarded-For」
        [ if-none ] 若是沒有首部才添加首部,若是有使用默認值
    爲指定的MIME 類型啓用壓縮傳輸功能
        compression algo <algorithm> ... :啓用http 協議的壓縮機制,指明壓縮算法gzip, deflate
        compression type <mime type> ... :指明壓縮的MIMI
錯誤頁配置
     errorfile <code> <file>  自定義錯誤頁
        <code> :HTTP status code.
            支持200, 400, 403, 408, 500, 502, 503, 504.
        <file> :錯誤頁文件路徑
    示例:
        errorfile 400 /etc/haproxy/errorfiles/400badreq.http
        errorfile 408 /dev/null # workaround Chrome pre-connect bug
        errorfile 403 /etc/haproxy/errorfiles/403forbid.http
        errorfile 503 /etc/haproxy/errorfiles/503sorry.http
    errorloc <code> <url>
        至關於errorloc302 <code> <url> ,利用302 重定向至指URL errorloc 503 http://www.magedu.com/error_pages/503.html
修改報文首部
    在請求報文尾部添加指定首部
        reqadd <string> [{if | unless} <cond>]
    在響應報文尾部添加指定首部
        rspadd <string> [{if | unless} <cond>]
        示例:rspadd X-Via:\ HAPorxy
    從請求報文中刪除匹配正則表達式的首部
        reqdel <search> [{if | unless} <cond>]
        reqidel <search> [{if | unless} <cond>]  不分大小寫
    從響應報文中刪除匹配正則表達式的首部
        rspdel <search> [{if | unless} <cond>]
        rspidel <search> [{if | unless} <cond>]  不分大 小寫
        示例: rspidel server.*
鏈接超時
    timeout client <timeout>
        客戶端最長空閒鏈接超時時長  默認單位是毫秒
    timeout server <timeout>
        後端服務器最長空閒鏈接超時時長
    timeout http-keep-alive <timeout>
        持久鏈接的持久時長
    timeout http-request <timeout>
        一次完整的HTTP 請求的最大等待時長
    timeout connect <timeout>
        成功鏈接後端服務器的最大等待時長
    timeout client-fin <timeout>
        客戶端 半鏈接的空閒時長
    timeout server-fin <timeout>
        後端服務器半鏈接的空閒時
ACL
    acl:
        訪問控制列表(ACL )的使用提供了一個靈活的解決方案來執行內容交換,而且一般基於從請求中提取的內容、響應或任何環境狀態進行決策。
    acl <aclname> <criterion> [flags] [operator] [<value>] ...
        <aclname>:ACL 名稱,可以使用字母數字 : . - _區分字符大小寫
        <criterion>:比較的標準和條件
    <value> 的類型:
        - boolean
        - integer or integer range
        - IP address / network
        - string (exact, substring, suffix, prefix, subdir,domain)
        - regular expression
        - hex block
    <flags>
        -i  不區分大小寫
        -m  使用指定的pattern 匹配方法
        -n  不作DNS 解析
        -u  強制每一個ACL 必須 惟一ID ,不然多個同名ACL或關係
        --  強制flag 結束.  當字符串和某個flag 類似時使用
    [operator]
        匹配整數值:eq 、ge 、gt 、le 、lt
        匹配字符串:
            - exact match (-m str) : 字符串必須徹底匹配模式
            - substring match (-m sub) : 在提取的字符串中查找模式,若是其中任何一個被發現,ACL將匹配
            - prefix match (-m beg) : 在提取的字符串首部中查找模式,若是其中任何一個被發現,ACL將匹配
            - suffix match (-m end) : 將模式與提取字符串的尾部進行比較,若是其中任何一個匹配,則ACL 進行匹配
            - subdir match (-m dir) : 查看提取 出來的用斜線分隔(「 「/」 )的字符串, 若是其中任何一個匹配,則ACL 進行匹配
            - domain match (-m dom) : 查找提取的用點(「.」 )分隔字符串,若是其中任何一個匹配,則ACL 進行匹配
     acl 做爲條件時的邏輯關係:
        -  與:隱式(默認)使用
        -  或:使用「or」 或「||」 表示
        -  否認:使用「!「  表示
        示例: 
            if invalid_src invalid_port 與關係
            if invalid_src || invalid_port 或
            if ! invalid_src 非
    <criterion> :各類條件
        dst              目標IP
        dst_port      目標PORT
        src               源IP
        src_port       源PORT
        示例:acl invalid_src src 172.16.100.200
    base : string
        返回第一個主機頭和請求的路徑部分的鏈接,該請求從第一個斜槓開始,並在問號以前結束, 對虛擬主機有用
        <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
            base : exact string match
            base_beg : prefix match
            base_dir : subdir match
            base_dom : domain match
            base_end : suffix match
            base_len : length match
            base_reg : regex match
            base_sub : substring match
    path : string
        提取請求的URL 路徑,該路徑從第一個斜槓開始,並在問號以前結束(無主機部分)
        <scheme>://<user>:<password>@<host>:<port>/<path>;<
            params>?<query>#<frag>
            path : exact string match
            path_beg : prefix match
            path_dir : subdir match
            path_dom : domain match
            path_end : suffix match
            path_len : length match
            path_reg : regex match
            path_sub : substring match
    url : string
        提取請求中的URL,一個典型的應用是具備預取能力的緩存,以及須要從數據庫聚合多個信息並將它們保存在緩存中的網頁門戶 入口
            url : exact string match
            url_beg : prefix match
            url_dir : subdir match
            url_dom : domain match
            url_end : suffix match
            url_len : length match
            url_reg : regex match
            url_sub : substring match
    req.hdr([<name>[,<occ>]]) : string
        提取在一個HTTP 請求報文的首部
        hdr([<name>[,<occ>]]) : exact string match
        hdr_beg([<name>[,<occ>]]) : prefix match
        hdr_dir([<name>[,<occ>]]) : subdir match
        hdr_dom([<name>[,<occ>]]) : domain match
        hdr_end([<name>[,<occ>]]) : suffix match
        hdr_len([<name>[,<occ>]]) : length match
        hdr_reg([<name>[,<occ>]]) : regex match
        hdr_sub([<name>[,<occ>]]) : substring match
        示例:
            acl bad_curl hdr_sub(User-Agent) -i curl
            block if bad_curl
    status : integer
        返回在響應報文中的狀態碼
    
    預約義ACL
        ACL名稱   等價於     說明
        TRUE    always_true     老是匹配
        FALSE   always_false    從不匹配
        HTTP    req_proto_http  匹配HTTP 協議
        HTTP_1.0    req_ver 1.0     匹配HTTP 協議1.0
        HTTP_1.1    req_ver 1.1     匹配HTTP 協議1.1
        HTTP_CONTENT    hdr_val(content-length) gt 0    匹配已存在內容長度
        HTTP_URL_ABS    url_reg ^[^/:]*://  匹配URL 絕對路徑
        HTTP_URL_SLASH  url_beg /   匹配URL 相對路徑
        HTTP_URL_STAR   url *   匹配 URL 於 等於 "*"
        LOCALHOST    src 127.0.0.1/8     匹配從localhost 來的鏈接
        METH_CONNECT     method CONNECT     匹配HTTP CONNECT
        METH_GET     method GET HEAD    match HTTP GET or HEAD method
        METH_HEAD   method HEAD     match HTTP HEAD method
        METH_OPTIONS    method OPTIONS  match HTTP OPTIONS method
        METH_POST   method POST     match HTTP POST method
        METH_TRACE  method TRACE    match HTTP TRACE method
        RDP_COOKIE  req_rdp_cookie_cnt gt 0     match presence of an RDP cookie
        REQ_CONTENT     req_len gt 0    match data in the request buffer
        WAIT_ENDwait_end    wait for end of content analysis    
    
    配置
        use_backend <backend> [{if | unless} <condition>]
            當if/unless 一個基於ACL 的條件匹配時切換指定backend
        block { if | unless } <condition>
            阻止7 層請求if/unless 一個條件匹配
            示例:
                acl invalid_src src 172.16.200.2
                block if invalid_src
                errorfile 403 /etc/fstab
        http-request { allow | deny |add-header <name> <fmt>|set-header <name> <fmt> } [ { if | unless }<condition> ]
            對7 層請求的訪問控制
         tcp-request connection {accept|reject} [{if | unless}<condition>]
            根據第4 層條件對傳入鏈接執行操做
            示例:
                listen ssh
                bind :22222
                mode tcp
                balance leastconn
                acl invalid_src src 172.16.0.200
                tcp-request connection reject if invalid_src
                server sshsrv1 192.168.1.101:22 check
                server sshsrv2 192.168.1.102:22 check backup
    
    基於ACL 的動靜分離示例
        frontend web *:80
            acl url_static path_beg -i /static /images /javascript/stylesheets
            acl url_static path_end -i .jpg .gif .png .css .js .html .txt .htm
            use_backend  staticsrvs if url_static
            default_backend appsrvs
        backend staticsrvs
            balance roundrobin
            server stcsrv1 172.16.100.6:80 check
        backend appsrvs
            balance roundrobin
            server app1 172.16.100.7:80 check
            server app1 172.16.100.7:8080 check
        listen stats
            bind :9091
            stats enable
            stats auth admin:admin
            stats admin if TRUE
        
支持https 協議
    配置HAProxy 支持https 協議:
    支持ssl 會話;
        bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
        crt  後證書文件爲PEM 格式,且同時包含證書和全部私鑰
        cat demo.crt demo.key > demo.pem
    把80 端口的請求重向定443
        bind *:80
        redirect scheme https if !{ ssl_fc }
    向後端傳遞用戶請求的協議和端口(frontend 或backend) )
        http_request set-header X-Forwarded-Port%[dst_port]
        http_request add-header X-Forwared-Proto https if { ssl_fc }
相關文章
相關標籤/搜索