二、Haproxy的部署及配置文件說明


一、Haproxy在centos7上的部署

1、實驗環境

System OS: CentOS Linux release 7.8.2003 (Core)
內核:3.10.0-1127.el7.x86_64

2、yum安裝

[root@node4 ~]# yum provides haproxy
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
haproxy-1.5.18-9.el7.x86_64 : TCP/HTTP proxy and load balancer for high availability environments
Repo        : base

[root@node4 ~]# yum install -y haproxy
#yum部署的haproxy版本為比較舊

3、第三方安裝包部署

 
#https://pkgs.org/download/haproxy #下載rpm包
#部署步驟

#准備工作
mkdir /app
cd /app

#Download latest cheese-release rpm from
#http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release.html
wget http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release-7-1.noarch.rpm

#Install cheese-release rpm:
rpm -Uvh cheese-release*rpm

#查看可以安裝的haproxy版本
[root@node4 ~]# yum provides haproxy
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
haproxy-1.5.15-1.el7.x86_64 : HAProxy reverse proxy for high availability environments
Repo        : cheese
haproxy-1.5.18-9.el7.x86_64 : TCP/HTTP proxy and load balancer for high availability environments 
Repo        : base
haproxy-1.7.3-2.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.12-4.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.13-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.14-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.14-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : @cheese


#Install haproxy rpm package:
yum install -y haproxy-1.8.14-1.el7.x86_64

#查看安裝的版本
[root@node4 ~]# haproxy -v
HA-Proxy version 1.8.14-52e4d43 2018/09/20
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>

4、編譯安裝HAProxy

編譯安裝HAProxy 2.0 LTS版本,更多源碼包下載地址:http://www.haproxy.org/download/

HAProxy 支持基於lua實現功能擴展,lua是一種小巧的腳本語言,於1993年由巴西里約熱內盧天主教大學
(Pontifical Catholic University of Rio de Janeiro)里的一個研究小組開發,其設計目的是為了嵌入應用程序中,
從而為應用程序提供靈活的擴展和定制功能。

Lua 應用場景
1)游戲開發
2)獨立應用腳本
3)Web 應用腳本
4)擴展和數據庫插件,如MySQL Proxy
5)安全系統,如入侵檢測系統

4.1、部署lua環境

由於centos自帶的lua版本比較低並不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要編譯安裝較新版本的 lua環境,然后才能編譯安裝HAProxy

 
#lua的當前版本
[root@node4 app]# lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

#源碼部署5.3.5lua
mkdir /app
cd /app
yum install -y libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar xvf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux test

#拷貝新版本的lua命令
mv /usr/bin/lua /usr/bin/lua.bak
ln -s /app/lua-5.3.5/src/lua /usr/bin/lua
[root@node4 lua-5.3.5]# ll /usr/bin/lua
lrwxrwxrwx 1 root root 22 Jan  6 18:58 /usr/bin/lua -> /app/lua-5.3.5/src/lua
[root@node4 ~]# lua -v
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio

4.2編譯安裝HAProxy

#下載haproxy2.0.4,下載地址:http://www.haproxy.org/download
mkdir /app
cd /app
wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.4.tar.gz
tar xvf haproxy-2.0.4.tar.gz
#安裝依賴包
yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate 

#安裝編譯環境
#HAProxy 1.8及1.9版本編譯參數:
cd haproxy-1.8.4
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1
USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy

#HAProxy 2.0編譯參數:
cd haproxy-2.0.4
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \
USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/app/lua-5.3.5/src/ \
LUA_LIB=/app/lua-5.3.5/src/ PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy
cp haproxy /usr/sbin/
echo 'export PATH=/usr/local/haproxy/sbin:$PATH' > /etc/profile.d/haproxy.sh
source /etc/profile

查看haproxy安裝版本

[root@node4 haproxy-2.0.4]# haproxy -v
HA-Proxy version 2.0.4 2019/08/06 - https://haproxy.org/

4.3創建haproxy的啟動用戶及配置文件

 
#啟動用戶
useradd -M -s /sbin/nologin haproxy
[root@node4 ~]# id haproxy
uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy)

#配置文件
mkdir /etc/haproxy
cd /etc/haproxy
cat >> harproxy.cfg <<EOF
global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#啟動用戶的uid和gid號,有2中配置方法
uid 99
gid 99
#user haproxy
#group haproxy
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.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
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
listen web_port
bind 192.168.7.101:80
mode http
log global
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
EOF

4.4HAproxy的啟動腳本

cat >> /usr/lib/systemd/system/haproxy.service <<EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin//haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target

4.5啟動haproxy

mkdir /var/lib/haproxy
chown haproy.haproxy /var/lib/haproxy/ -R
systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy
[root@node4 ~]# id haproxy
uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy)
[root@node4 ~]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2021-01-06 19:58:33 CST; 1h 31min ago
  Process: 19093 ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q (code=exited, status=0/SUCCESS)
 Main PID: 19095 (haproxy)
   CGroup: /system.slice/haproxy.service
           ├─19095 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
           └─19098 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid

Jan 06 19:58:33 node4 systemd[1]: Starting HAProxy Load Balancer...
Jan 06 19:58:33 node4 systemd[1]: Started HAProxy Load Balancer.
Jan 06 19:58:33 node4 haproxy[19095]: [NOTICE] 005/195833 (19095) : New worker #1 (19098) forked
Jan 06 19:58:33 node4 haproxy[19095]: [WARNING] 005/195833 (19098) : Server web_port/web1 is DOWN, reason: Layer4 connection problem, info: "Conn...in queue.
Jan 06 19:58:33 node4 haproxy[19095]: [ALERT] 005/195833 (19098) : proxy 'web_port' has no server available!
Hint: Some lines were ellipsized, use -l to show in full.

[root@node4 ~]# ps -ef |grep haproxy
root     19095     1  0 19:58 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
haproxy  19098 19095  0 19:58 ?        00:00:01 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
root     23640  1811  0 21:32 pts/0    00:00:00 grep --color=auto haproxy

二、haproxy的基礎配置

HAPrpxy的配置文件haproxy.cfg由兩大部分組成,分別是global和proxies部分。

global:全局配置段

進程及安全配置相關的參數
性能調整相關參數
Debug參數

proxies:代理配置段

defaults:為frontend, backend, listen提供默認配置
frontend:前端,相當於nginx中的server {}
backend:后端,相當於nginx中的upstream {}
listen:同時擁有前端和后端配置

1、global配置參數

官方文檔 https://cbonte.github.io/haproxy-dconv/2.0/intro.html

global    #全局參數的設置
chroot /usr/local/haproxy #鎖定運行目錄
deamon #以守護進程運行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #socket文件
 #運行haproxy的用戶身份
user haproxy 
group haproxy
#uid 1000
#gid 1000
nbproc  2 #開啟的haproxy進程數,與CPU保持一致
nbthread 1 #指定每個haproxy進程開啟的線程數,默認為每個進程一個線程
#綁定haproxy 進程至指定CPU
cpu-map 1 0 
cpu-map 2 1
maxconn  4000 #每個haproxy進程的最大並發連接數
maxsslconn #每個haproxy進程ssl最大連接數,用於haproxy配置了證書的場景下
maxconnrate #每個進程每秒創建的最大連接數量
spread-checks 2 #后端server狀態check隨機提前或延遲百分比時間,建議2-5(20%-50%)之間
pidfile /var/lib/haproxy/haproxy.pid #指定pid文件路徑
log 127.0.0.1 local3 info #定義全局的syslog服務器;最多可以定義兩個
# log語法:log <address_1>[max_level_1] 
# 全局的日志配置,使用log關鍵字,指定使用127.0.0.1上的syslog服務中的local0日志設備,記錄日志等級為info的日志

2、Proxies配置

官方文檔 https://cbonte.github.io/haproxy-dconv/2.0/configuration.html

defaults [<name>] #默認配置項,針對以下的frontend、backend和lsiten生效,可以多個name也可以沒有
name
frontend <name> #前端servername,類似於Nginx的一個虛擬主機 server。
backend <name> #后端服務器組,等於nginx的upstream
listen <name> #將frontend和backend合並在一起配置

注意:name字段只能使用”-”、”_”、”.”、和”:”,並且嚴格區分大小寫,例如:Web和web是完全不同的兩組服務器。

2.1 Proxies配置-defaults

defaults 配置參數:

 
option redispatch #當server Id對應的服務器掛掉后,強制定向到其他健康的服務器,重新派發
option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接,關閉
option http-keep-alive #開啟與客戶端的會話保持
option forwardfor #透傳客戶端真實IP至后端web服務器
mode http #設置默認工作類型
timeout http-keep-alive 120s #session 會話保持超時時間,范圍內會轉發到相同的后端服務器
timeout connect 120s #客戶端請求從haproxy到后端server的最長連接等待時間(TCP之前)
timeout server 600s #客戶端請求從haproxy到后端服務端的請求處理超時時長(TCP之后)
timeout client 600s #設置haproxy與客戶端的最長非活動時間
timeout check 5s #對后端服務器的默認檢測超時時間

2.2 Proxies配置-frontend

frontend配置參數

 
bind:指定HAProxy的監聽地址,可以是IPV4或IPV6,可以同時監聽多個IP或端口,可同時用於listen字段中
bind [<address>]:<port_range> [, ...] [param*]

listen http_proxy #監聽http的多個IP的多個端口和sock文件
  bind :80,:443,:8801-8810
  bind 10.0.0.1:10080,10.0.0.1:10443
  bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
listen http_https_proxy #https監聽
  bind :80
  bind :443 ssl crt /etc/haproxy/site.pem

listen http_https_proxy_explicit #監聽ipv6、ipv4和unix sock文件
  bind ipv6@:80
  bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
  bind unix@ssl-frontend.sock user root mode 600 accept-proxy
listen external_bind_app1 #監聽file descriptor
  bind "fd@${FD_APP1}"
生產示例:
frontend WEB_PORT
  bind :80,:8080
  bind 192.168.7.102:10080,:8801-8810,192.168.7.101:9001-9010
  mode http/tcp #指定負載協議類型
  use_backend backend_name #調用的后端服務器組名稱

2.3 Proxies配置-backend

定義一組后端服務器,backend服務器將被frontend進行調用

 
mode http/tcp #指定負載協議類型
option #配置選項
server #定義后端real server
#注意:option后面加httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk方法,可用於實現更多應用層檢測功能

check #對指定real進行健康狀態檢查,默認不開啟
  addr IP #可指定的健康狀態監測IP
  port num #指定的健康狀態監測端口
  inter num #健康狀態檢查間隔時間,默認2000 ms
  fall num #后端服務器失效檢查次數,默認為3
  rise num #后端服務器從下線恢復檢查次數,默認為2
weight #默認為1,最大值為256,0表示不參與負載均衡
backup #將后端服務器標記為備份狀態
disabled #將后端服務器標記為不可用狀態
redirect prefix http://www.magedu.net/ #將請求臨時重定向至其它URL,只適用於http模式
maxconn <maxconn>:當前后端server的最大並發連接數
backlog <backlog>:當server的連接數達到上限后的后援隊列長度

2.4 frontend+backend配置實例

#官網業務訪問入口
frontend WEB_PORT_80
  bind 192.168.7.248:80
  mode http
  use_backend web_prot_http_nodes
#后端真實服務器
backend web_prot_http_nodes
mode http
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5

2.5 Proxies配置-listen替代frontend+backend

使用listen替換frontend和backend的配置方式:
#官網業務訪問入口=====================================
listen WEB_PORT_80
  bind 192.168.7.102:80
  mode http
  option forwardfor
  server web1 192.168.32.201:80 check inter 3000 fall 3 rise 5
  server web2 192.168.32.202:80 check inter 3000 fall 3 rise 5

三、實驗案例

1、實驗環境

System OS: CentOS Linux release 7.8.2003 (Core)
內核:3.10.0-1127.el7.x86_64

web01:
node1 10.0.0.201 nginx
web02:
node2 10.0.0.202 nginx
haproxy:
node4 192.168.32.204 外網
node4 10.0.0.204 內網

客戶機:
node3 192.168.32.203

2、web服務部署

yum install -y nginx
systemctl start nginx
systemctl enable nginx

web01
echo 'web01 10.0.0.201' > /usr/share/nginx/html/index.html
web02
echo 'web02 10.0.0.202' > /usr/share/nginx/html/index.html

[root@node4 ~]# curl 10.0.0.201
web01 10.0.0.201
[root@node4 ~]# curl 10.0.0.202
web02 10.0.0.202

3、haproxy部署

haproxy的安裝部署見前文

haproxy.cfg文件配置

global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#uid 1000
#gid 1000
user haproxy
group haproxy
daemon
nbproc 2
cpu-map 1 0
cpu-map 2 1
pidfile /var/lib/haproxy/haproxy.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
  bind 192.168.32.204:9999
  stats enable
  log global
stats uri /haproxy-status
  stats auth haadmin:123456

listen web_port
  bind 192.168.32.204:80
  mode http
  log global
  balance roundrobin
  server web01 10.0.0.201:80 check inter 3000 fall 2 rise 5
  server web02 10.0.0.202:80 check inter 3000 fall 2 rise 5

4、測試

在客戶機上測試

 
[root@node3 ~]# curl 192.168.32.204
web01 10.0.0.201
[root@node3 ~]# curl 192.168.32.204
web01 10.0.0.201
[root@node3 ~]# curl 192.168.32.204
web02 10.0.0.202
[root@node3 ~]# curl 192.168.32.204
web02 10.0.0.202
#客戶端訪問

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM