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
留言列表