一、Haproxy在centos7上的部署
1、實驗環境
System OS: CentOS Linux release 7.8.2003 (Core) 內核:3.10.0-1127.el7.x86_64
[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版本為比較舊
#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>
編譯安裝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)安全系統,如入侵檢測系統
由於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
#下載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/
#啟動用戶 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
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
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
HAPrpxy的配置文件haproxy.cfg由兩大部分組成,分別是global和proxies部分。
global:全局配置段
進程及安全配置相關的參數
性能調整相關參數
Debug參數
proxies:代理配置段
defaults:為frontend, backend, listen提供默認配置
frontend:前端,相當於nginx中的server {}
backend:后端,相當於nginx中的upstream {}
listen:同時擁有前端和后端配置
官方文檔
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的日志
官方文檔 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是完全不同的兩組服務器。
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 #對后端服務器的默認檢測超時時間
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 #調用的后端服務器組名稱
定義一組后端服務器,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的連接數達到上限后的后援隊列長度
#官網業務訪問入口 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
使用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
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
在客戶機上測試
[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 #客戶端訪問