Haproxy安裝與配置(HTTPS)
安裝方式一
通過apt-get
安裝:
sudo apt-get update
sudo apt-get install haproxy
複製程式碼
安裝方式二
通過原始碼編譯安裝,原始碼下載地址:www.haproxy.org/
# 安裝編譯工具
sudo apt-get install libssl-dev make
# 解壓
tar -xf haproxy-x.x.x.tar.gz
cd haproxy-x.x.x.tar
# 普通安裝方式,haproxy不支援SSL
sudo make TARGET=linux2628 ARCH=x86_64 prefix=/usr/local/haproxy install
# 需要haproxy支援SSL時,使用如下編譯方式
sudo make TARGET=linux2628 ARCH=x86_64 USE_OPENSSL=1 ADDLIB=-lz prefix=/usr/local/haproxy install
#將haproxy和openssl庫連線
ldd haproxy | grep ssl
複製程式碼
haproxy配置
執行命令檢視使用者的uid,gid:id <username>
支行命令:sudo vim /etc/haproxy/haproxy.cfg
修改配置檔案
注意:這裡的 pem
檔案是下面兩個檔案合併而成:
cat servername.crt servername.key |tee servername.pem
# this config needs haproxy-1.1.28 or higher edition
global
log 127.0.0.1 local0 debug
#log 127.0.0.1 local1 notice
maxconn 4096
uid 1000
gid 1000
chroot /etc/haproxy
pidfile /var/run/haproxy.pid
daemon
nbproc 4
tune.ssl.default-dh-param 2048
#2 lines below modify the maxHttpHeaderSize
#tune.bufsize 65536
#tune.chksize 65536
#debug
#quiet
defaults
log global
mode http
option dontlognull
option redispatch
option abortonclose
retries 3
timeout connect 30s
timeout queue 5s
timeout client 1800s
timeout server 1800s
timeout check 30s
#timeout client-fin 30s
#timeout server-fin 30s
#timeout tunnel 1800s
listen stats
bind 0.0.0.0:8888
stats refresh 30s
stats uri /
stats realm baison-test-Haproxy
stats auth chianyu:cyadmin
bind-process 1
frontend https_frontend
bind *:80
#bind *:443 ssl crt /etc/ssl/xip.io/xip.io.pem
bind *:443 ssl crt /etc/haproxy/sslforfree/ssl.pem
#http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-SSL %[ssl_fc]
redirect scheme https if !{ ssl_fc }
mode http
default_backend http_nodes
backend http_nodes
mode http
#option httpchk
option forwardfor
#option httpclose
#option http-keep-alive
#balance roundrobin
cookie svr_ckie insert nocache
server web1 192.168.1.10:8080 cookie web_1 check inter 2000 fall 3 weight 1
server web2 192.168.1.11:8080 cookie web_2 check inter 2000 fall 3 weight 2
#capture cookie vgnvisitor= len 32
複製程式碼
timeout http request
在客戶端建立連線但不請求資料時,關閉客戶端連線timeout http-keep-alive
定義保持連線的超時時長timeout check
健康狀態監測時的超時時間,過短會誤判,過長資源消耗timeout connect
連線嘗試成功連線到server的超時時間timeout queue
在佇列等待連線槽釋放的超時時間timeout server
server端非活動狀態超時時間timeout client
客戶端非活動狀態超時時間timeout server-fin
半關閉狀態連線,server端非活動超時時間timeout client-fin
半關閉狀態連線,client端非活動超時時間timeout tunnel
客戶端和伺服器端通道非活動超時時間http-server-close
在使用長連線時,為了避免客戶端超時沒有關閉長連線,此功能可以使伺服器端關閉長連線redispatch
在使用基於cookie定向時,一旦後端某一server宕機時,會將會話重新定向至某一上游伺服器,必須使用的選項
讓系統支援大量連線,檔案/etc/security/limits.conf
新增:
* soft nofile 150000
* hard nofile 180000
複製程式碼
haproxy負載均衡演演算法
-
roundrobin
表示簡單的輪詢; -
static-rr
表示根據權重; -
leastconn
表示最少連線者先處理; -
source
表示根據請求源IP; -
uri
表示根據請求的URI; -
url_param
表示根據請求的URl引數; -
hdr(name)
表示根據HTTP請求頭來鎖定每一次HTTP請求; -
rdp-cookie(name)
表示根據據cookie(name)來鎖定並雜湊每一次TCP請求。
目前haproxy支援的負載均衡演演算法說明
1、roundrobin
表示簡單的輪詢,每個伺服器根據權重輪流使用,在伺服器的處理時間平均分配的情況下這是最流暢和公平的演演算法。該演演算法是動態的,對於例項啟動慢的伺服器權重會在執行中調整。
2、leastconn
連線數最少的伺服器優先接收連線。leastconn建議用於長會話服務,例如LDAP、SQL、TSE等,而不適合短會話協議。如HTTP.該演演算法是動態的,對於例項啟動慢的伺服器權重會在執行中調整。
3、static-rr
每個伺服器根據權重輪流使用,類似roundrobin,但它是靜態的,意味著執行時修改許可權是無效的。另外,它對伺服器的數量沒有限制。
該演演算法一般不用;
4、source
對請求源IP地址進行雜湊,用可用伺服器的權重總數除以雜湊值,根據結果進行分配。只要伺服器正常,同一個客戶端IP地址總是訪問同一個伺服器。如果雜湊的結果隨可用伺服器數量而變化,那麼客戶端會定向到不同的伺服器;
該演演算法一般用於不能插入cookie的Tcp模式。它還可以用於廣域網上為拒絕使用會話cookie的客戶端提供最有效的粘連;
該演演算法預設是靜態的,所以執行時修改伺服器的權重是無效的,但是演演算法會根據“hash-type”的變化做調整。
5、uri
表示根據請求的URI左端(問號之前)進行雜湊,用可用伺服器的權重總數除以雜湊值,根據結果進行分配。只要伺服器正常,同一個URI地址總是訪問同一個伺服器。一般用於代理快取和反病毒代理,以最大限度的提高快取的命中率。該演演算法只能用於HTTP後端;
該演演算法一般用於後端是快取伺服器;
該演演算法預設是靜態的,所以執行時修改伺服器的權重是無效的,但是演演算法會根據“hash-type”的變化做調整。
6、url_param
在HTTP GET請求的查詢串中查詢中指定的URL引數,基本上可以鎖定使用特製的URL到特定的負載均衡器節點的要求;
該演演算法一般用於將同一個使用者的資訊傳送到同一個後端伺服器;
該演演算法預設是靜態的,所以執行時修改伺服器的權重是無效的,但是演演算法會根據“hash-type”的變化做調整。
7、hdr(name)
在每個HTTP請求中查詢HTTP頭,HTTP頭將被看作在每個HTTP請求,並針對特定的節點;
如果缺少頭或者頭沒有任何值,則用roundrobin代替;
該演演算法預設是靜態的,所以執行時修改伺服器的權重是無效的,但是演演算法會根據“hash-type”的變化做調整。
8、rdp-cookie(name)
為每個進來的TCP請求查詢並雜湊RDP cookie;
該機制用於退化的持久模式,可以使同一個使用者或者同一個會話ID總是傳送給同一臺伺服器。如果沒有cookie,則使用roundrobin演演算法代替;
該演演算法預設是靜態的,所以執行時修改伺服器的權重是無效的,但是演演算法會根據“hash-type”的變化做調整。
常用演演算法:roundrobin
、source
、lestconn
haproxy相關命令
手動啟動haproxy命令:sudo haproxy -f /etc/haproxy/haproxy.cfg
手動關閉haproxy命令:sudo killall haproxy
過載haproxy配置:sudo haproxy -f /etc/haproxy/haproxy.cfg -sf
過載haproxy配置(不中斷服務):sudo haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
haproxy開機啟動:將啟動命令新增到檔案/etc/rc.local中
生成自簽名證書
$ sudo mkdir /etc/ssl/xip.io
$ sudo openssl genrsa -out /etc/ssl/xip.io/xip.io.key 1024
$ sudo openssl req -new -key /etc/ssl/xip.io/xip.io.key -out /etc/ssl/xip.io/xip.io.csr
$ sudo openssl x509 -req -days 365 -in /etc/ssl/xip.io/xip.io.csr -signkey /etc/ssl/xip.io/xip.io.key -out /etc/ssl/xip.io/xip.io.crt
複製程式碼
這就生成了axip.io.csr,xip.io.key和xip.io.crt檔案了
接著,在建立了證書之後,我們需要建立 pem 檔案。pem 檔案本質上只是將證書、金鑰及證書認證中心證書(可有可無)拼接成一個檔案。我們只是簡單地將證書及金鑰檔案並以這個順序拼接在一樣來建立 xip.io.pem 檔案。這是 HAProxy 讀取SSL證書首選的方式
$ sudo cat /etc/ssl/xip.io/xip.io.crt /etc/ssl/xip.io/xip.io.key | sudo tee /etc/ssl/xip.io/xip.io.pem
當購買真正的證書時,不一定會獲取拼接後的檔案,你可以要自己拼接它們。然而,很多機構也會提供一份拼接好的檔案給你。如果你沒有獲取到拼接後的檔案,則它可能不是一個 pem 檔案,而是 bundle、cert、cert、key檔案或一些相同概念但名稱類似的檔案。Stack Overflow: What is a pem file ... 答案對問題解釋得很好。
參考
在 HAproxy 1.5 中使用 SSL 證書 景安網路:申請免費HTTPS證書 景安SSL Configure HAProxy to Load Balance Sites With SSL Haproxy Configuration Manual v1.8 Accelerating SSL Load Balancers with Intel® Xeon® v3 Processors Let's Encrypt 給網站加 HTTPS 完全指南 SSL For Free 真正零停機 HAProxy 過載 Configuring HAProxy and Jetty Aidaho12/haproxy-wi 負載均衡技術之3負載分類