Haproxy 是一個快速,簡單又容易安裝的軟件,可做為網頁分流及簡易的HA 的功能,是一個小而美的軟件!

以下是個人實際使用的案例及安裝過程記錄! 詳細可以訪問官網 http://haproxy.1wt.eu/

1.環境設定

mkdir /var/run/haproxy
useradd haproxy

2.下載 haproxy

wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.15.tar.gz

3.安裝

cd /tmp

tar -zxvf  haproxy-1.4.15.tar.gz

cd  haproxy-1.4.15

make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

4.編輯設定檔
vi /usr/local/haproxy/haproxy.cfg

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        chroot /usr/local/haproxy
        uid haproxy
        gid haproxy
        daemon
        quiet
        nbproc 2
        pidfile /var/run/haproxy/haproxy.pid

listen http_proxy 10.XX.XX.XX:80,10.XX.XX.XX:443  ##監聽的 IP 及 port 有多個ports 可以用逗號分開
        mode tcp
        balance roundrobin
        server srv1 10.XX.XX.XX check weight 3 inter 2000 rise 2 fall 3
        server srv2 10.XX.XX.XX check weight 1 inter 2000 rise 2 fall 3

5.開啟服務

/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

 

 問題解決:

1.多部 web 主機的 session 問題.

   網路上找到有三種解決方式,但我實際測驗僅其中一種可以完全正常,

  (1) balance roundrobin 改為   balance source

  (2) 加入 appsession PHPSESSID len 128 timeout 1h request-learn

  (3) 確認 php.ini 的內容 session.name = PHPSESSID 名稱須一致!

2.Https 無法正常問題

   由於 https 及http 其 mode [http,tcp] 方式不同結果也不同,故後來我將其進行分開的設定.

3.如何取得 client 端實際IP?  

  (1) 以php 例,主機端可用

   $ip = ( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? ( $_SERVER['HTTP_X_FORWARDED_FOR'] ) : ( $_SERVER['REMOTE_ADDR'] );

 取得client 端實際IP,但我測試結果僅對 http 有效,https 則只能取到 haproxy server 的 IP.

 (2) access.log 如何正確顯示 client ip.

  apache:httpd.conf 內容修改

 

  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common

 

 

最終我的 config 變更為如下的設定,運行都可正常!

listen http_proxy
        bind 10.XX.XX.XX:80
        mode http
        balance roundrobin
        option httpclose
        option forwardfor
        appsession PHPSESSID len 128 timeout 1h request-learn
        server srv2 10.XX.XX.XX:80 check weight 1 inter 2000 rise 2 fall 3
        server srv1 10.XX.XX.XX:80 check weight 1 inter 2000 rise 2 fall 3

 

listen https_proxy
        bind 10.XX.XX.XX:443
        balance source
        option httpclose
        option forwardfor
        appsession PHPSESSID len 128 timeout 1h request-learn
        server srv2 10.XX.XX.XX:443 check weight 1 inter 2000 rise 2 fall 3
        server srv1 10.XX.XX.XX:443 check weight 1 inter 2000 rise 2 fall 3

 

 

---------------------------------Haproxy 1.4.17 並追加 log 機制----------------------

 

Haproxy 1.4.17 安裝及追加 log 功能 ,並修正了一些錯誤的問題!

  

global
        maxconn 4096
        chroot /usr/local/haproxy
        uid haproxy
        gid haproxy
        daemon
        nbproc 1 --改為1 是因為使用了appsession 參數,若用 2 會出現警示,雖然還是能用.
        pidfile /var/run/haproxy/haproxy.pid

defaults
        contimeout      3000
        clitimeout      150000
        srvtimeout      150000

listen https_proxy
        log     global
        log 127.0.0.1 local3 info
        bind 10.X.X.X:443
        balance source
        appsession PHPSESSID len 128 timeout 1h request-learn
        server srv2 10.X.X.X:443 check weight 1 inter 2000 rise 2 fall 3
        server srv1 10.X.X.X7:443 check weight 1 inter 2000 rise 2 fall 3

listen http_proxy
        log     global
        log 127.0.0.1 local4 info
        bind 10.X.X.X:80
        mode http
        option  httplog
        option  dontlognull
        balance roundrobin
        option httpclose
        option forwardfor
        appsession PHPSESSID len 128 timeout 1h request-learn
        server srv2 10.X.X.X:80 check weight 1 inter 2000 rise 2 fall 3
        server srv1 10.X.X.X:80 check weight 1 inter 2000 rise 2 fall 3

##如何產生 haproxy 的 log ,查了文件,依照方法處理了,但一直無法收到 log ,一直以為是 haproxy.log 及 /etc/syslog.conf 設定錯誤,試了很久一直失敗!
##找到原因後實在很悶,為何系統文件都不提供有如此必要的設定需注意啊!
整理如下:
1.haproxy.log

  listen https_proxy
        log     global
        log 127.0.0.1 local3 info
        ......

  listen http_proxy
        log     global
        log 127.0.0.1 local4 info
 .........
  
2./etc/syslog.conf
  #Haproxy
  local3.* /var/log/haproxy_443.log
  local4.* /var/log/haproxy_80.log

3./etc/sysconfig/syslog --這一個是很多網上的參考資料所忽略的,但我只在 RedHat/Centos 實際測試過!
(1) redhat/CentOS
    修改參數如下 :
    SYSLOGD_OPTIONS="-m 0 -r" --很重要

(2) Debian/Ubuntu
    須改為設定  /etc/default/syslogd
    修改參數如下 :
    SYSLOGD="-r"

4.service syslog restart

5.haproxy restart

文章標籤
創作者介紹

吳承軒的部落格

Jason0615 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • Jerry
  • if you use centos, just edit /etc/rsyslog.conf and remove the leading # from
    $ModLoad imudp
    $UDPServerRun 514
    and restart rsyslog service.