1. 程式人生 > 程式設計 >Haproxy安裝與配置(HTTPS)

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負載均衡演演算法

  1. roundrobin表示簡單的輪詢;
  2. static-rr表示根據權重;
  3. leastconn表示最少連線者先處理;
  4. source表示根據請求源IP;
  5. uri表示根據請求的URI;
  6. url_param表示根據請求的URl引數;
  7. hdr(name)表示根據HTTP請求頭來鎖定每一次HTTP請求;
  8. 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”的變化做調整。

常用演演算法:roundrobinsourcelestconn

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負載分類