目錄
- 一、Haproxy概述、簡介
- (1)Haproxy簡介
- (2)Haproxy和LVS、Nginx的比較
- (3)Haproxy的代理模式
- 二、利用Haproxy+nginx搭建web群集
- 實驗環境
- 實驗目的
- 實驗步驟
- (1)部署兩臺nginx服務器(兩臺步驟相同,撰寫網頁不同)
- (2)部署haproxy服務器
- (3)驗證
- 三、擴展——haproxy的日志管理
一、Haproxy概述、簡介
(1)Haproxy簡介
- Haproxy是一個開源的高性能的反向代理或者說是負載均衡服務軟體之一,也是目前來說比較流行的一種集群調度工具
- 支持雙機熱備、虛擬主機、基于TCP和HTTP應用代理等功能
- 對于雙機熱備來說,Haproxy配置簡單,擁有很好的對服務器節點的健康檢查功能,當其代理的后端服務器出現故障時,Haproxy會自動的將該故障服務器摘除,當服務器的故障恢復后Haproxy還會自動講RS服務器添加
(和keepalived的健康檢查差不多) - 對于高性能的反向代理來說,Haproxy使用于那些訪問量很大,但是又需要會話保持或者七層應用的業務,Haproxy運行在普通的服務器硬體上,僅僅是進行簡單的優化就可以支持數以萬計的并發連接,并且它的運行模式使得它可以很簡單、安全的整合到各種網站的架構中,同時使得應用服務器的ip地址不會暴露在網路中,Haproxy軟體引入了frontend (前端) 和 backend (后端) 的功能,而frontend的acl匹配規則可以讓運維管理人員根據任意HTTP請求作為頭部來進行規則匹配,然后再把請求定向到相關的backend
(即server pools 服務器池等待前端把請求轉過來的服務器組),通過frontend和backup (備用服務器) ,我們可以很容易的實作Haproxy的七層代理功能,haproxy是一款不可多得的優秀代理服務軟體

(2)Haproxy和LVS、Nginx的比較
- LVS性能最好,但是相對于Haproxy來說,搭建要復雜許多
- Nginx的upstream模塊支持集群功能,但是對集群節點的健康檢查功能不強,性能沒有Haproxy好
(3)Haproxy的代理模式
主要支持兩種代理模式:
第一個: 四層TCP代理
例如:可以用于郵件服務器內部協議通信服務器、Mysql服務器等
第二個: 七層代理
在四層TCP代理模式下,Haproxy僅在客戶端和服務器之間雙向轉發流量,但是在七層模式下Haproxy會分析應用層協議,并且能夠通過運行、拒絕、交換、增加、修改或者洗掉請求(request)或者回應(reponse)里指定內容來控制協議
二、利用Haproxy+nginx搭建web群集
實驗環境
以下實驗所用的系統均為Centos7!
| 名稱 | ip地址 | 扮演角色 |
|---|---|---|
| haproxy | 192.168.100.1 | haproxy代理服務器 |
| nginx1 | 192.168.100.2 | nginx服務器 |
| nginx2 | 192.168.100.3 | nginx服務器 |
實驗目的
利用haproxy+nginx搭建的群集,使內部web服務器不用把ip地址暴露在網路上,并且實作兩臺web服務器頁面的來回切換,實作負載均衡
實驗步驟
(1)部署兩臺nginx服務器(兩臺步驟相同,撰寫網頁不同)
******(1)先做基礎配置,nginx1和nginx2
————nginx1:
[root@Centos7 ~]# hostnamectl set-hostname nginx1
[root@Centos7 ~]# su
[root@nginx1 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 寫保護,將以只讀方式掛載
mount: /dev/sr0 已經掛載或 /mnt 忙
/dev/sr0 已經掛載到 /mnt 上
————nginx2:
[root@Centos7 ~]# hostnamectl set-hostname nginx2
[root@Centos7 ~]# su
[root@nginx2 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 寫保護,將以只讀方式掛載
mount: /dev/sr0 已經掛載或 /mnt 忙
/dev/sr0 已經掛載到 /mnt 上
******(2)分別在兩臺機器上安裝必要組件、上傳nginx的原始碼包進行配置、編譯、安裝,并且撰寫web頁面
————nginx1:
[root@nginx1 ~]# yum -y install pcre-devel zlib-devel
,,,,,,
完畢!
[root@nginx1 ~]# ls
anaconda-ks.cfg nginx-1.12.0.tar.gz
[root@nginx1 ~]# tar xf nginx-1.12.0.tar.gz -C /usr/src/
[root@nginx1 ~]# cd /usr/src/nginx-1.12.0/
[root@nginx1 nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
[root@nginx1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &&make &&make install
[root@nginx1 nginx-1.12.0]# echo "11111111" > /usr/local/nginx/html/index.html
[root@nginx1 nginx-1.12.0]# /usr/local/nginx/sbin/nginx
[root@nginx1 nginx-1.12.0]# netstat -anpt | grep nginx (查看埠號是否已經成功啟動nginx)
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6297/nginx: master
[root@nginx1 nginx-1.12.0]# curl 127.0.0.1 (測驗是否可以正常訪問)
11111111
————nginx2:
[root@nginx2 ~]# yum -y install pcre-devel zlib-devel
[root@nginx2 ~]# ls
anaconda-ks.cfg nginx-1.12.0.tar.gz
[root@nginx2 ~]# tar xf nginx-1.12.0.tar.gz -C /usr/src/
[root@nginx2 ~]# cd /usr/src/nginx-1.12.0/
[root@nginx2 nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
[root@nginx2 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
[root@nginx2 nginx-1.12.0]# echo "2222222" > /usr/local/nginx/html/index.html
[root@nginx2 nginx-1.12.0]# /usr/local/nginx/sbin/nginx
[root@nginx2 nginx-1.12.0]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3923/nginx: master
[root@nginx2 nginx-1.12.0]# curl 127.0.0.1
2222222
(2)部署haproxy服務器
******(1)先做基礎配置
[root@Centos7 ~]# hostnamectl set-hostname haproxy
[root@Centos7 ~]# su
[root@haproxy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 寫保護,將以只讀方式掛載
mount: /dev/sr0 已經掛載或 /mnt 忙
/dev/sr0 已經掛載到 /mnt 上
******(2)安裝必要組件上傳haproxy的原始碼包并且進行安裝
[root@haproxy ~]# yum -y install pcre-devel bzip2-devel
,,,,,,
完畢!
[root@haproxy ~]# ls
anaconda-ks.cfg haproxy-1.5.19.tar.gz
[root@haproxy ~]# tar xf haproxy-1.5.19.tar.gz -C /usr/src/
[root@haproxy ~]# cd /usr/src/haproxy-1.5.19/
[root@haproxy haproxy-1.5.19]# make TARGET=linux26 (表示安裝64位系統)
[root@haproxy haproxy-1.5.19]# make install
[root@haproxy haproxy-1.5.19]# cd
******(3)配置haproxy
[root@haproxy ~]# vim /usr/src/haproxy-1.5.19/examples/haproxy.cfg (模板檔案)
——————————————————————————————————————華麗分割線————————————————————————————————————————
組態檔決議:
global 全域部分
log /dev/log local0 info
log /dev/log local1 notice 把info和notice日志分別存放,以便查看
maxconn 4096 最大連接數
uid 99 用戶id
gid 99 組id
# pidfile /var/run/haproxy.pid pid檔案的路徑及檔案名
daemon 后臺運行
defaults 默認配置
log global 應用全域部分的日志配置
mode http 模式為http
option httplog
option dontlognull
retries 3 檢查節點的失敗次數,連續達到3次認為節點不可用
maxconn 2000 最大連接數
contimeout 5000 連接超時時間5000
clitimeout 50000 客戶端超時時間50000
srvtimeout 50000 服務器超時時間50000
# option httpclose 關閉客戶端請求
listen webcluster 0.0.0.0:80 web集群(偵聽的地址和介面)
option httpchk GET /index.html 檢查http檔案
balance roundrobin 負載均衡調度演算法 輪詢 roundrobin
server inst1 192.168.100.2:80 check inter 2000 fall 3
server inst2 192.168.100.3:80 check inter 2000 fall 3
##上面的兩個server項都是nginx節點服務的地址、名稱、埠 、檢查間隔時間、健康檢查次數3次認為失敗
全域部分中日志存放位置/dev/log 目錄中的log檔案是一個套接字(socket),它是一條通信線路的站點,而這些終點(sockets)之間存在著資料通訊網路,
它的通信程序是:
程式通過訪問遠程計算機的socket地址,訪問的計算機的socket地址跟遠程計算機的socket地址之間就建立了一條通訊線路,socket相當于是一個獨有的身份標識
———————————————————————————————————————————————————————————————————————————————————————
******(4)創建一個新的目錄,創建新的組態檔
[root@haproxy ~]# mkdir /etc/haproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
寫入:
global
log /dev/log local0 info
log /dev/log local1 notice
maxconn 4096
uid 99
gid 99
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webcluster 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.100.2:80 check inter 2000 fall 3
server inst2 192.168.100.3:80 check inter 2000 fall 3
保存退出
******(5)優化haproxy的命令執行路徑,使系統可以識別haproxy的命令
[root@haproxy ~]# cp /usr/src/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@haproxy ~]# chmod +x /etc/init.d/haproxy
[root@haproxy ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@haproxy ~]# /etc/init.d/haproxy restart
Reloading systemd: [ 確定 ]
Restarting haproxy (via systemctl): [ 確定 ]
(3)驗證
打開一臺測驗機訪問haproxy服務器的地址192.168.100.1
第一次訪問

第二次訪問

發現可以成功切換頁面,并且內網web服務器也沒有將ip地址暴露,由此,haproxy+nginx群集搭建完成!!
三、擴展——haproxy的日志管理
要知道Haproxy的日志默認是輸出到系統的syslog中的,查看起來非常不方便,為了方便管理和查看haproxy的日志,需要在生產環境中單獨定義
[root@haproxy ~]# cd /etc/rsyslog.d/
[root@haproxy rsyslog.d]# vim haproxy.conf (撰寫新的組態檔)
寫入:
local0.* /var/log/haproxy/ha-info.log
local1.* /var/log/haproxy/ha-notice.log
保存退出
[root@haproxy rsyslog.d]# vim /etc/sysconfig/rsyslog (修改系統日志檔案)
修改為:
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-r -m 0 -c 2"
保存退出
[root@haproxy rsyslog.d]# systemctl restart rsyslog (重啟rsyslog服務)
[root@haproxy rsyslog.d]# /etc/init.d/haproxy restart (重啟haproxy服務)
Restarting haproxy (via systemctl): [ 確定 ]
[root@haproxy rsyslog.d]# tail -5 /var/log/haproxy/ha-info.log (使用測驗機再次訪問然后查看日志,發現已經成功記錄)
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:14.911] webcluster webcluster/inst2 185/0/0/0/185 200 242 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.096] webcluster webcluster/inst1 179/0/0/1/180 200 243 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.276] webcluster webcluster/inst2 189/0/0/1/190 200 242 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.466] webcluster webcluster/inst1 187/0/0/1/188 200 243 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.654] webcluster webcluster/inst2 123/0/1/0/124 200 242 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262130.html
標籤:其他
上一篇:第一次攢機記錄
