該文檔在CentOS7.6系統下進行編譯安裝haproxy 1.8.25
主機名稱 | ip地址 | 操作系統 | 角色 | 軟件版本 | 備註 |
---|---|---|---|---|---|
opsproxy-shqs-1 | 10.99.73.38 | CentOS 7.6 | haproxy | 1.8.25 | 長期支持版本LTS |
如果要通過keepalived配置高可用,參考編譯安裝keepalived
一、編譯安裝haproxy
1.1 下載haproxy源碼包
wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.25.tar.gz
tar zxvf haproxy-1.8.25.tar.gz
1.2 編譯安裝haproxy
我的編譯軟件統一安裝在/opt/app/install/目錄下面,然後軟連接到/opt/app/下面。所以這裏設置haproxy的安裝目錄爲/opt/app/install/haproxy
# 準備編譯環境
yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel systemd-devel
# 切換到haproxy源碼根目錄
cd haproxy-1.8.25
# 編譯 linux內核版本大於2.6.28的都可以使用TARGET=linux2628
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/opt/app/install/haproxy
# 安裝
make install PREFIX=/opt/app/install/haproxy
# 可執行文件拷貝一份到系統執行文件目錄,該目錄在path變量裏面,可以直接使用haproxy命令
cp haproxy /usr/sbin/
# 軟連接(這一步謹是我自己對軟件目錄管理的需求)
ln -s /opt/app/install/haproxy /opt/app/haproxy
# 配置haproxy用戶和組。因爲yum安裝haproxy生成的也是這個ID,這裏組/用戶ID設置爲188,僅僅是爲了保持一致,其實設置爲多少都可以。
groupadd -g 188 haproxy
useradd -u 188 -g 188 -r -s /sbin/nologin haproxy
# haproxy附加參數文件,這個可以不用設置的,這裏是爲了和yum安裝方式保持一致。
touch /etc/sysconfig/haproxy
vi /etc/sysconfig/haproxy
OPTIONS=""
# pid文件放置目錄,目錄可以自己定義在啓動腳本里面使用
mkdir /opt/app/haproxy/run
# socket方式的相關文件目錄,這裏沒有用到
# mkdir /var/lib/haproxy
# chown -R haproxy:haproxy /var/lib/haproxy/
1.3 haproxy配置文件
這裏僅僅是一個簡單的配置文件,只是配置了一個統計服務stats,並沒有配置實際的業務服務代理。部署驗證這些就夠了。
配置文件目錄/opt/app/haproxy/haproxy.cfg
vi /opt/app/haproxy/haproxy.cfg
global
user haproxy
group haproxy
daemon
nbproc 2
#cpu-map 1 0
#cpu-map 2 1
maxconn 100000
chroot /opt/app/haproxy
pidfile /opt/app/haproxy/run/haproxy.pid
log 127.0.0.1 local0 info
defaults
log global
option httplog
option http-keep-alive
option redispatch
option forwardfor
maxconn 100000
mode http
retries 3
timeout check 5s
timeout connect 5s
timeout client 60s
timeout server 60s
timeout http-request 10s
timeout queue 1m
listen stats
bind 0.0.0.0:1234
log global
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats
stats refresh 5s
stats auth admin:admin
1.4 配置system自啓動文件
-
編寫配置文件
vi /usr/lib/systemd/system/haproxy.service [Unit] Description=HAProxy Load Balancer After=syslog.target network.target [Service] EnvironmentFile=/etc/sysconfig/haproxy ExecStartPre=/usr/sbin/haproxy -f /opt/app/haproxy/haproxy.cfg -c -q ExecStart=/usr/sbin/haproxy -Ws -f /opt/app/haproxy/haproxy.cfg -p /opt/app/haproxy/run/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID KillMode=mixed [Install] WantedBy=multi-user.target
-
加載文件
systemctl daemon-reload
-
配置自啓動
systemctl enable haproxy
-
啓動服務
systemctl start haproxy systemctl status haproxy netstat -pltn tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 20808/haproxy
-
訪問http://10.99.73.38:1234/stats
1.5 配置記錄Haproxy訪問日誌
- 根據haproxy.cfg配置文件裏面配置
log 127.0.0.1 local0 info
進行配置yum -y install rsyslog touch /etc/rsyslog.d/haproxy.conf vi /etc/rsyslog.d/haproxy.conf $ModLoad imudp $UDPServerRun 514 local0.* /var/log/haproxy.log
- 重新啓動rsyslog生效配置
systemctl restart rsyslog
- 日誌訪問
# 需要訪問過haproxy纔會生成文件以及內容 tail -f /var/log/haproxy.log Jul 2 22:50:51 localhost haproxy[18038]: 127.0.0.1:46154 [02/Jul/2020:22:50:51.310] stats stats/<STATS> -1/-1/-1/-1/0 401 262 - - PR-- 1/1/0/0/3 0/0 "GET /stats HTTP/1.1" Jul 2 22:50:51 localhost haproxy[18038]: 127.0.0.1:46154 [02/Jul/2020:22:50:51.310] stats stats/<STATS> -1/-1/-1/-1/0 401 262 - - PR-- 1/1/0/0/3 0/0 "GET /stats HTTP/1.1"
二、配置業務代理
這裏是一個配置harbor代理的實例
主機名稱 | ip地址 | 操作系統 | 角色 | 端口 | 備註 |
---|---|---|---|---|---|
opsharbor-shqs-1 | 10.99.73.38 | CentOS 7.6 | docker hub<主節點> | 80 自動跳轉443 443 |
前面實際是一個nginx |
opsharbor-shqs-2 | 10.99.73.39 | CentOS 7.6 | docker hub<從節點> | 80 自動跳轉443 443 |
前面實際是一個nginx |
這裏我們使用haproxy來代理harbor,並使用tcp協議代理,實際處理流程交給後端的nginx處理
client --> haproxy-1(master-vip) --> harbor-1
| \ /
| / \
+ haproxy-2(backup) --> harbor-2
這裏的配置適合haproxy+keepalived與harbor不在同一組服務器上的方式,如果在同一組服務器上由於VIP只在一臺服務器上,haproxy相同的配置導致從節點監控VIP:port無法啓動。
如果確實在一組服務器上,需要配置一個健康腳本,讓VIP所在節點haproxy運行,而非VIP節點haproxy停止運行。並實時監控切換。
global
user haproxy
group haproxy
daemon
nbproc 2
#cpu-map 1 0
#cpu-map 2 1
maxconn 100000
chroot /opt/app/haproxy
pidfile /opt/app/haproxy/run/haproxy.pid
log 127.0.0.1 local0 info
defaults
log global
mode http
maxconn 100000
option httplog
option dontlognull
option http-keep-alive
option redispatch
#option forwardfor
retries 3
timeout check 10s
timeout connect 100s
timeout client 3600s
timeout server 3600s
timeout http-request 100s
timeout queue 1m
listen stats
bind 0.0.0.0:1234
log global
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats
stats auth admin:admin
listen harbor_http
bind :80
balance first
mode tcp
option tcplog
server harbor_1 10.99.73.38:80 check inter 20000 rise 2 fall 5
server harbor_2 10.99.73.39:80 backup check inter 20000 rise 2 fall 5
listen harbor_https
bind :443
balance first
mode tcp
option tcplog
server harbor_1 10.99.73.38:443 check inter 20000 rise 2 fall 5
server harbor_2 10.99.73.39:443 backup check inter 20000 rise 2 fall 5
重啓haproxy服務
systemctl restart haproxy.service
systemctl status haproxy.service
netstat -plnt |grep haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7087/haproxy
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 7087/haproxy