HaProxy介紹:
haproxy是法國開發者威利塔羅在2000年使用C語言開發的一個開源軟件,是一款具備高并發(一萬以上)、高性能的TCP和HTTP負載均衡器,支持基于cookie的持久性,自動故障切換,支持正則表達式及web狀態統計,目前最新TLS版本為2.2。
haproxy是可提供可用性、負載均衡以及基于TCP和HTTP應用的代理,是免費、快速并且可靠的一種解決方案。haproxy非常適用于并發大(并發達1W以上)web站點,這些站點通常又需要會話保持或七層處理,haproxy的運行模式使得它可以很簡單安全的整合至當前的架構中,同時可以保護web服務器不被暴露到網絡上。
LVS,nginx,haproxy對比:
LVS是內核中的功能,nginx和haproxy是第三方實現的功能。
LVS只能提供四層負載均衡無法提供七層負載,(無法控制7層協議http頭部url等),功能單一。
nginx,haproxy可以實現4層和7層負載,功能較多,但是性能不如LVS,LVS>haproxy>nginx
haproxy對比nginx性能優越,功能單一,haproxy只做反向代理。
LVS沒有后端服務器健康性檢測,nginx和haproxy有后端服務器健康性檢測。
安裝haproxy:
三種方式:yum,rpm和編譯
yum安裝:yum install -y haproxy
[root@Node1 ~]#:yum install -y haproxy? ? ? ? ? ? ? ? #安裝
[root@Node1 ~]#:systemctl start haproxy? ? ? ? ? ? ? ? #啟動
[root@Node1 ~]#:systtemctl status haproxy? ? ? ? ? ? ? ? #查看是否啟動
可以rpm -qc haproxy查看配置文件
rpm安裝:
錯誤:軟件包:rh-haproxy18-haproxy-1.8.24-3.el7.x86_64 (/rh-haproxy18-haproxy-1.8.24-3.el7.x86_64)
rpm安裝haproxy需要需要:rh-haproxy18-runtime
需要依賴包
[root@Node1 ~]#:mkdir /hprxy; cd /phrxy
#準備一個runtime包,直接拖進來到目錄下,然后下載haproxy包
[root@Node1 hprxy]#:wget http://mirror.centos.org/centos/7/sclo/x86_64/rh/Packages/r/rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm
[root@Node1 hprxy]#:ls
rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm ?rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm[root@Node1 hprxy]#:yum install -y rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm
[root@Node1 hprxy]#:yum install -y rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm#啟動服務
[root@Node1 hprxy]#:systemctl start rh-haproxy18-haproxy.service查看狀態:systemctl status?rh-haproxy18-haproxy.service發現啟動了
可以通過rpm -qc 服務名;rpm -ql 服務名,查看配置文件和列出文件相關文件。
編譯安裝haproxy:
在第二臺機器7-2上編譯安裝,7-1和7-3作為web真實服務器
由于CentOS7 之前版本自帶的lua版本比較低并不符合haproxy要求的lua最低版本(5.3)的要求,因此需要編譯安裝較新版本的lua環境,然后才能編譯安裝haproxy,所以需要先安裝lua環境。
[root@Node2 ~]#:mkdir /data ; cd /data
#查看當前lua版本,是5.1版本的。
[root@Node2 data]#:lua -v
Lua 5.1.4 ?Copyright (C) 1994-2008 Lua.org, PUC-Rio
#可以現在安裝lua新版本:wget?https://www.lua.org/ftp/lua-5.4.6.tar.gz
[root@Node2 data]#:wget https://www.lua.org/ftp/lua-5.4.6.tar.gz#準備安裝包:haproxy-2.4.25.tar,直接拖進來/data/下
[root@Node2 data]#:ls
haproxy-2.4.25.tar.gz ?lua-5.4.6.tar.gz#解壓
[root@Node2 data]#:tar xf lua-5.4.4.tar.gz
#做個軟鏈接
[root@Node2 data]#:ln -s lua-5.4.6 lua
[root@Node2 data]#:cd lua-5.4.4/src/
[root@Node2 src]#:make all test
#查看版本信息
[root@Node2 src]#:./lua -v
Lua 5.4.6 ?Copyright (C) 1994-2023 Lua.org, PUC-Rio? ? ? ? ? ? ? ? #5.4版本
#安裝haproxy
#安裝依賴環境:
[root@Node2 data]#:yum -y install gcc openssl-devel pcre-devel systemd-devel
#解壓
[root@Node2 data]#:tar xf haproxy-2.4.25.tar.gz
[root@Node2 data]#:cd haproxy-2.4.25/
#創建lua目錄用于自動補全功能
[root@Node2 haproxy-2.4.25]#:mkdir /usr/local/lua
[root@Node2 haproxy-2.4.25]#:cp -r src/ ? /usr/local/lua/
[root@Node2 haproxy-2.4.25]#:make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/ ?LUA_LIB=/data/lua/src/#安裝,指定路徑
[root@Node2 haproxy-2.4.25]#:make install PREFIX=/apps/haproxy#軟鏈接,自動補全
[root@Node2 haproxy-2.4.25]#:ln -s /apps/haproxy/sbin/haproxy /usr/sbin/
#haproxy -v可以查看版本信息。haproxy -h查看幫助#寫一個自啟動文件:
[root@Node2 haproxy-2.4.25]#:vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg ?-c -q ? ? #-c檢查語法。-f指定配置文件,也可以跟文件夾
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid ?#-p指定pid文件
ExecReload=/bin/kill -USR2 $MAINPID ? #重新加載
LimitNOFILE=100000 ? ?#打開文件數
[Install]
WantedBy=multi-user.target
[root@Node2 haproxy-2.4.25]#:systemctl daemon-reload
#創建主配置文件目錄。需要手動創建[root@Node2 haproxy-2.4.25]#:mkdir /etc/haproxy
#創建主配置文件/etc/haproxy/haproxy.cfg
global:全局配置段
進程及安全配置相關的參數
性能調整相關參數
Debut參數
proxies:代理配置段
defaults:為frontend,backend,listen提供默認配置
frontend:前端,相當于nginx中的server{},定義虛擬機,監聽分配請求
backend:后端,相當于nginx中的upstream{},真實服務器
listen:同時擁有前端和后端配置,配置簡單,生產推薦使用,前端和后端,更簡單。
主配置文件配置塊:
[root@Node2 haproxy-2.4.25]#:vim /etc/haproxy/haproxy.cfg
#全局模塊,
global
maxconn 100000? ? ? ? ? ? ? ? #最大連接數
chroot /apps/haproxy????????????????#禁錮,haproxy進程,只可以訪問,/apps/haroxy文件夾
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin? ? ? ? ?#指明sock文件的位置#指明uid和gid
uid 99
gid 99
#后臺方式,守護進程daemon
#進程數, 開啟幾個進程#nbproc 4?????????????????? ?#nbthread線程與nbproc進程不能同時指定
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid? ? ? ? ? ? ? ? #指定PID路徑
log 127.0.0.1 local3 info? ? ? ? ? ? ? ? ? ? ????????? ? #日志
?defaults
option http-keep-alive
option ?forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client ?300000ms
timeout server ?300000ms#狀態頁
listen stats
mode http? ? ? ? ? ? ? ? 支持7層http
bind 0.0.0.0:9999
stats enable
log global
stats uri ? ? /haproxy-status????????
stats auth ? ?haadmin:123456? ? ? ? ? ? ? ? #用戶名和密碼listen ?web
bind 0.0.0.0:8899
mode http
log globalserver web1 ?192.168.114.10:80
server web2 ?192.168.114.30:80#指定一個pid路徑
[root@Node2 haproxy-2.4.25]#:mkdir ?/var/lib/haproxy
#創建用戶haproxy
[root@Node2 haproxy-2.4.25]#:useradd -r -s /sbin/nologin ?haproxy
#啟動haproxy
[root@Node2 haproxy-2.4.25]#:systemctl enable --now haproxy
起來之后查看狀態:
listen中說明了代理服務器,和后端真實服務器。
而frontend和backup就把兩者分離出來。listen相當于兩者的結合。
7-1和7-3作為web服務器。下載httpd:
yum install -y httpd
systemctl start httpd
7-1:echo 7-1 > /var/www/html/index.html
7-3:echo 7-3 > /var/www/html/index.html
systemctl status httpd查看狀態是否都起來了。并且能curl通
測試是否實現了代理和負載均衡:在瀏覽器也可以在本臺服務器上curl 192.168.114.20:8899要跟上端口號:8899。因為我們在listen中設置的就是8899端口號。
狀態頁:
在配置文件中有以下三個配置,端口號,uri,訪問控制。在瀏覽器地址欄中輸入:192.168.114.20:9999/haproxy-status
bind 0.0.0.0:9999
stats uri ? ? /haproxy-status
stats auth ? ?haadmin:123456
?
進程:發現進程是一個進程下三個線程
?修改進程配置,nbproc 4就是有四個進程:
重啟systemctl restart haproxy。
通過進程樹查看一下:?
日志:
vim /etc/rsyslog.conf打開文件開啟15和16行。
在/etc/rsyslog.conf文件的73行下添加一行,指定local3,并制定日志文件路徑在/var/log/haproxy.log
重啟systemctl restart haproxy rsyslog
使用瀏覽器訪問192.168.114.20:8899
在日志文件中tail -f /var/log/haproxy.log實時查看
不使用listen,而使用frontend和backup兩個模塊:相當于把listen分開寫,frontend是代理端,backup是服務端,負載均衡的web服務器。把listen注釋掉或者刪除。
?測試:由于我們指定的80端口,直接是curl 192.168.114.20不需要加端口,默認就是80。
其中listen或者說frontend和backup可以放在子配置文件中:
創建一個子配置文件:mkdir /etc/haproxy/conf.d
直接寫在子配置文件中,但haproxy不像nginx可以在主配置文件中寫入include包含模塊。haproxy主配置文件不支持include。需要將子配置文件寫在/usr/lib/systemd/system/haproxy.service文件中指明。
?把主配置文件中的注釋掉。修改文件:vim /usr/lib/systemd/system/haproxy.service
重新加載配置文件,重啟服務:
[root@Node2 haproxy]#:systemctl daemon-reload
[root@Node2 haproxy]#:systemctl restart haproxy
訪問測試:
haproxy也有跳轉的功能,在server后加入check redir http://www.baidu.com
?自動跳轉到百度主頁,如果瀏覽器跳轉不到(但也會顯示標題頭部是百度的),可以使用內置火狐瀏覽器:192.168.114.20。將自動跳轉到百度首頁。
---end---