天天看點

Nginx從安裝到高可用(二)五、配置ssl證書提供https通路六、配置ha nginx七、LVS(Linux Virtual Server)實作高可用負載均衡八、搭建Keepalived+Lvs+Nginx高可用叢集負載均衡

五、配置ssl證書提供https通路

1. 安裝SSL子產品

要在nginx中配置https,就必須安裝ssl子產品,也就是:

http_ssl_module

進入到nginx的解壓目錄:

/home/software/nginx-1.16.1

新增ssl子產品(原來的那些子產品需要保留)

./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --with-http_ssl_module           

複制

編譯和安裝

make
make install           

複制

2、配置HTTPS

把ssl證書

*.crt

和 私鑰

*.key

拷貝到

/usr/local/nginx/conf

目錄中。

如果沒有SSL證書的,可以參照https://blog.csdn.net/erlib/article/details/46636055或者https://www.cnblogs.com/lcchuguo/p/5124073.html 擷取測試的證書。

新增 server 監聽 443 端口:

server {
    listen       443;
    server_name  www.imoocdsp.com;
    # 開啟ssl
    ssl     on;
    # 配置ssl證書
    ssl_certificate      1_www.imoocdsp.com_bundle.crt;
    # 配置證書秘鑰
    ssl_certificate_key  2_www.imoocdsp.com.key;
    # ssl會話cache
    ssl_session_cache    shared:SSL:1m;
    # ssl會話逾時時間
    ssl_session_timeout  5m;
    # 配置加密套件,寫法遵循 openssl 标準
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    
    location / {
        proxy_pass http://tomcats/;
        index  index.html index.htm;
    }
}           

複制

server 80端口添加請求轉發:

server {
        listen       80;
        server_name  localhost;
        #将請求轉成https
		rewrite ^(.*)$ https://$host$1 permanent;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
	    proxy_pass http://hello-server;
            root   html;
            index  index.html index.htm;
        }
}           

複制

六、配置ha nginx

1、安裝keepalived

(1)下載下傳

https://www.keepalived.org/download.html           

複制

(2)解壓

tar -zxvf keepalived-2.0.18.tar.gz           

複制

(3)使用configure指令配置安裝目錄與核心配置檔案所在位置:

./configure --prefix=/usr/local/keepalived --sysconf=/etc           

複制

  • prefix:keepalived安裝的位置sysconf:keepalived核心配置檔案所在位置,固定位置,改成其他位置則keepalived啟動不了,

    /var/log/messages

    中會報錯
  • sysconf:keepalived核心配置檔案所在位置,固定位置,改成其他位置則keepalived啟動不了,

    /var/log/messages

    中會報錯

配置過程中可能會出現警告資訊,如下所示:

*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

# 安裝libnl/libnl-3依賴
yum -y install libnl libnl-devel             

複制

(4)安裝keepalived

make && make install           

複制

(5)配置檔案 在

/etc/keepalived/keepalived.conf

(6)忘記安裝配置的目錄,則通過如下指令找到:

whereis keepalived           

複制

(7)啟動keepalived

進入sbin目錄

./keepalived           

複制

2、配置keepalived 主機

(1)通過指令

vim keepalived.conf

打開配置檔案

global_defs { 
    # 路由id:目前安裝keepalived的節點主機辨別符,保證全局唯一 
    router_id keep_171 
} 

vrrp_instance VI_1 { 
    # 表示狀态是MASTER主機還是備用機BACKUP 
    state MASTER 
    # 該執行個體綁定的網卡 
    interface ens33 
    # 保證主備節點一緻即可 
    virtual_router_id 51 
    # 權重,master權重一般高于backup,如果有多個,那就是選舉,誰的權重高,誰就當選 
    priority 100 
    # 主備之間同步檢查時間間隔,機關秒 
    advert_int 2 
    # 認證權限密碼,防止非法節點進入 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    # 虛拟出來的ip,可以有多個(vip) 
    virtual_ipaddress { 
        192.168.1.161 
    }
}           

複制

附:檢視網卡資訊指令

ip addr           

複制

(2)啟動keepalived

(3)檢視程序

ps -ef|grep keepalived           

複制

(4)檢視vip(虛拟ip)

在網卡ens33下,多了一個

192.168.1.161

,這個就是虛拟ip

3、把keepalived注冊為系統服務

(1)拷貝配置檔案

  • 将keepalived目錄下

    etc/init.d/keepalived

    拷貝到

    /etc/init.d/

  • 将keepalived目錄下

    etc/sysconfig/keepalived

    拷貝到

    /etc/sysconfig/

(2)重新整理systemctl

systemctl daemon-reload           

複制

(3)啟動、停止、重新開機keepalived

#啟動
systemctl start keepalived.service
#停止
systemctl stop keepalived.service
#重新開機
systemctl restart keepalived.service           

複制

4、實作雙機主備高可用

Nginx從安裝到高可用(二)五、配置ssl證書提供https通路六、配置ha nginx七、LVS(Linux Virtual Server)實作高可用負載均衡八、搭建Keepalived+Lvs+Nginx高可用叢集負載均衡

(1)修改備機配置

global_defs { 
    router_id keep_172 
} 
vrrp_instance VI_1 { 
    # 備用機設定為BACKUP 
    state BACKUP 
    interface ens33 
    virtual_router_id 51 
    # 權重低于MASTER 
    priority 80 
    advert_int 2 
    authentication { 
        auth_type PASS auth_pass 1111 
    }
    virtual_ipaddress {
        # 注意:主備兩台的vip都是一樣的,綁定到同一個vip 
        192.168.1.161 
    } 
}           

複制

(2) 啟動 Keepalived

(3) 通路vip即可通路主機,當主機失效時通路vip就會通路到備機

5、keepalived配置nginx自動重新開機

(1)編寫腳本

/etc/keepalived/

下建立腳本

check_nginx_alive_or_not

#!/bin/bash 

A=`ps -C nginx --no-header |wc -l` 
# 判斷nginx是否當機,如果當機了,嘗試重新開機 
if [ $A -eq 0 ];then 
    /usr/local/nginx/sbin/nginx 
    # 等待一小會再次檢查nginx,如果沒有啟動成功,則停止keepalived,使其啟動備用機 
    sleep 3 
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
            killall keepalived 
        fi 
fi           

複制

(2)添加運作權限

chmod +x /etc/keepalived/check_nginx_alive_or_not.sh           

複制

(3)配置keepalived監聽nginx腳本

vrrp_script check_nginx_alive { 
    script "/etc/keepalived/check_nginx_alive_or_not.sh" 
    interval 2 # 每隔兩秒運作上一行腳本 
    weight 10 # 如果腳本運作失敗,則更新權重+10 
}           

複制

(4)在vrrp_instance中新增監控的腳本

track_script { 
    check_nginx_alive # 追蹤 nginx 腳本
}           

複制

(5)重新開機Keepalived使得配置檔案生效

systemctl restart keepalived           

複制

6、keepalived雙主熱備

(1)配置DNS輪詢

在同一個域名下配置兩個ip,自行百度

(2)配置第一台主機

global_defs {
    router_id keep_171 
} 
vrrp_instance VI_1 { 
    state MASTER i
    nterface ens33 
    virtual_router_id 51 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.161 
    } 
} 

vrrp_instance VI_2  {
    state BACKUP 
    interface ens33 
    virtual_router_id 52 
    priority 80 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.162 
    }
}           

複制

(3)配置第二台主機

global_defs {
    router_id keep_172 
} 
vrrp_instance VI_1 { 
    state BACKUP 
    interface ens33 
    virtual_router_id 51 
    priority 80 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.161
    }
} 

vrrp_instance VI_2 {
    state MASTER 
    interface ens33 
    virtual_router_id 52 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.162 
    }
}           

複制

(4)重新開機兩台Keepalived

systemctl restart keepalived           

複制

七、LVS(Linux Virtual Server)實作高可用負載均衡

1、為什麼要使用LVS+Nginx

  • lvs基于四層負載均衡,工作效率較Nginx的七層負載更高,使用LVS搭建Nginx叢集,可以提高性能
  • 四層負載均衡無法對資訊處理,隻能通過ip+端口的形式轉發,是以需要七成負載進行資料的處理
  • Nginx接收請求來回,LVS可以隻接受不響應

2、LVS的三種模式

(1)NAT模式

  • 用戶端将請求發往LVS,LVS會選擇一台伺服器響應請求,伺服器将結果傳回給LVS,LVS再傳回給用戶端。
  • 在NAT模式中,伺服器的網關必須指向LVS,否則封包無法送達用戶端
  • NAT 技術将請求的封包和響應的封包都需要通過LVS進行位址改寫,是以網站通路量比較大的時候負載均衡排程器有比較大的瓶頸,一般要求最多之能 10-20 台節點
  • NAT 模式支援對 IP 位址和端口進行轉換。即使用者請求的端口和真實伺服器的端口可以不一緻

(2)TUN模式

  • 用戶端将請求發往LVS,LVS會選擇一台伺服器響應請求,在用戶端與伺服器之間建立隧道,傳回結果的時候直接由伺服器傳回響應,不在經過LVS。
  • TUN模式必須所有的伺服器上都綁定VIP的IP位址,所有的伺服器都必須有網卡。
  • TUN模式走隧道運維難度大,并且會直接暴露伺服器位址
  • 伺服器将應答包直接發給使用者。是以,減少了負載均衡器的大量資料流動,負載均衡器不再是系統的瓶頸,就能處理很巨大的請求量,這種方式,一台負載均衡器能夠為很多伺服器進行分發。而且跑在公網上就能進行不同地域的分發

(3)DR模式

  • 用戶端将請求發往LVS,LVS會選擇一台伺服器響應請求,傳回結果的時候通過統一的路由進行傳回,不在經過LVS。
  • 和TUN模式一樣,LVS隻是分發請求,應答包通過單獨的路由傳回給用戶端,與TUN相比這種方式不需要隧道結構,可以相容大多數的作業系統,同時統一路由可以隐藏真實的實體伺服器。DR模式效率更高,但配置更複雜.
  • 所有伺服器節點和LVS隻能在一個區域網路裡面。

3、搭建LVS-DR模式

先關閉掉伺服器上網絡配置管理器,避免網絡接口沖突

systemctl stop NetworkManager
systemctl disable NetworkManager           

複制

(1)建立子接口(建立LVS的虛拟ip)

進入網卡配置目錄

/etc/sysconfig/network-scripts/

,找到網卡配置檔案,這裡以

ifcfg-ens33

為例,拷貝并建立子接口

cp ifcfg-ens33 ifcfg-ens33:1           

複制

修改子接口配置如下

  • 配置中的 192.168.1.150 就是vip,是提供給外網使用者通路的ip位址
DEVICE="ens33:1"
ONBOOT="yes"
IPADDR=192.168.1.150
NETMASK=255.255.255.0
BOOTPROTO=static           

複制

  • 重新開機網絡服務
service network restart           

複制

重新開機成功後,ip addr 檢視一下,你會發現多了一個ip,也就是虛拟ip(vip)

注意:阿裡雲不支援配置網卡,需要購買相應的負載均衡服務,騰訊雲支援配置網卡,但需要購買網卡支援,一個網卡支援10個虛拟ip配置

(2)安裝ipvsadm

如今的centos都內建了LVS,是以ipvs是自帶的,我們隻需要安裝ipvsadm即可(ipvsadm是管理叢集的工具,通過ipvs可以管理叢集,檢視叢集等操作)

yum install ipvsadm           

複制

(3)配置伺服器(RS)的虛拟ip

進入網卡配置目錄

/etc/sysconfig/network-scripts/

,找到

ifcfg-lo

,拷貝并建立子接口

cp ifcfg-lo ifcfg-lo:1           

複制

修改子接口配置如下

DEVICE="lo:1"
IPADDR=192.168.1.150
NETMASK=255.255.255.255
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT="yes"
NAME=loopback           

複制

重新開機網絡服務成功後,

ip addr

檢視一下,你會發現多了一個ip,也就是虛拟ip(vip)

(4)為伺服器(RS)配置arp

ARP響應級别與通告行為參數說明

arp-ignore:ARP響應級别(處理請求)
    0:隻要本機配置了ip,就能響應請求
    1:請求的目标位址到達對應的網絡接口,才會響應請求
arp-announce:ARP通告行為(傳回響應)
    0:本機上任何網絡接口都向外通告,所有的網卡都能接受到通告
    1:盡可能避免本網卡與不比對的目标進行通告2:隻在本網卡通告           

複制

打開sysctl.conf:

vim /etc/sysctl.conf           

複制

配置所有網卡、預設網卡以及虛拟網卡的arp響應級别和通告行為,分别對應:all,default,lo

# configration for lvs 
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.default.arp_ignore = 1 
net.ipv4.conf.lo.arp_ignore = 1 

net.ipv4.conf.all.arp_announce = 2 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_announce = 2           

複制

重新整理配置檔案

sysctl -p           

複制

增加一個網關,用于接收資料封包,當有請求到本機後,會交給lo去處理

route add -host 192.168.1.150 dev lo:1           

複制

将網關添加至開機啟動

echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local           

複制

(4)使用ipvsadm配置叢集規則

建立LVS節點,使用者通路的叢集排程者

ipvsadm -A -t 192.168.1.150:80 -s rr -p 5           

複制

  • -A:添加叢集
  • -t:tcp協定ip位址:設定叢集的通路
  • ip:也就是LVS的虛拟ip
  • -s:設定負載均衡的算法,
  • rr:表示輪詢
  • -p:設定連接配接持久化的時間,在指定時間内同一個使用者的請求會通路到同一個伺服器中

建立多台RS真實伺服器

ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g 
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g           

複制

  • -a:添加真實伺服器
  • -t:tcp協定
  • -r:真實伺服器的ip位址
  • -g:設定DR模式

儲存到規則庫,否則重新開機失效

ipvsadm -S           

複制

檢查叢集

#檢視叢集清單
ipvsadm -Ln
#檢視叢集狀态
ipvsadm -Ln --stats           

複制

一些其他指令

 # 重新開機ipvsadm,重新開機後需要重新配置 
 service ipvsadm restart 
 # 檢視持久化連接配接 
 ipvsadm -Ln --persistent-conn 
 # 檢視連接配接請求過期時間以及請求源ip和目标ip 
 ipvsadm -Lnc 
 # 設定tcp tcpfin udp 的過期時間(一般保持預設) 
 ipvsadm --set 1 1 1 
 # 檢視過期時間 
 ipvsadm -Ln --timeout           

複制

(5)通路虛拟ip,完成LVS搭建

附:LVS的負載均衡算法

(1)靜态算法

靜态:根據LVS本身自由的固定的算法分發使用者請求。

  • 輪詢(Round Robin 簡寫’rr’):輪詢算法假設所有的伺服器處理請求的能力都一樣的,排程器會把所有的請求平均配置設定給每個真實伺服器。(同Nginx的輪詢)
  • 權重輪詢(Weight Round Robin 簡寫’wrr’):安裝權重比例配置設定使用者請求。權重越高,被配置設定到處理的請求越多。(同Nginx的權重)
  • 源位址散列(Source Hash 簡寫’sh’):同一個使用者ip的請求,會由同一個RS來處理。(同Nginx的ip_hash)
  • 目标位址散列(Destination Hash 簡寫’dh’):根據url的不同,請求到不同的RS。(同Nginx的url_hash)

(2)動态算法

動态:會根據流量的不同,或者伺服器的壓力不同來配置設定使用者請求,這是動态計算的。

  • 最小連接配接數(Least Connections 簡寫’lc’):把新的連接配接請求配置設定到目前連接配接數最小的伺服器。
  • 權重最少連接配接數(Weight Least Connections 簡寫’wlc’):伺服器的處理性能用數值來代表,權重越大處理的請求越多。Real Server 有可能會存在性能上的差異,wlc動态擷取不同伺服器的負載狀況,把請求分發到性能好并且比較空閑的伺服器。
  • 最短期望延遲(Shortest Expected Delay 簡寫’sed’):特殊的wlc算法。舉例闡述,假設有ABC三台伺服器,權重分别為1、2、3 。如果使用wlc算法的話,當一個新請求進來,它可能會分給ABC中的任意一個。使用sed算法後會進行如下運算:
    • A:(1+1)/1=2
    • B:(1+2)/2=3/2
    • C:(1+3)/3=4/3

最終結果,會把這個請求交給得出運算結果最小的伺服器。最少隊列排程(Never Queue 簡寫’nq’):永不使用隊列。如果有Real Server的連接配接數等于0,則直接把這個請求配置設定過去,不需要在排隊等待運算了(sed運算)。

八、搭建Keepalived+Lvs+Nginx高可用叢集負載均衡

如果原先伺服器上配置了LVS+nginx需要清空ipvsadm中的配置

ipvsadm -C           

複制

如果配置了

Keepalived+Nginx

雙主叢集也需要去除掉Keepalived中原先的配置,按照的後文進行配置

(1)使用keepalived配置Master LVS

在LVS的機器上安裝keepalived,安裝過程參考上文

(1)修改keepalived的配置

global_defs {
    router_id keep_151 
} 
vrrp_instance VI_1 { 
    state MASTER 
    interface ens33 
    virtual_router_id 41 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.150
    }
} 

#配置叢集通路的ip+端口,端口和nginx保持一緻
virtual_server 192.168.1.150 80{
    #健康檢查的時間,機關:秒
    delay_loop 6
    #配置負載均衡的算法,預設的輪詢
    lb_algo rr
    #設定LVS的模式 NAT|TUN|DR
    lb-kind DR
    #設定會話持久化的時間
    persistence_timeout 5
    #協定
    protocol TCP
    
    #配置負載均衡的真實伺服器,也就是nginx節點的具體的ip位址
    real_server 192.168.1.171 80{
        #輪詢權重配比
        weight 1
        #設定健康檢查
        TCP_CHECK {
            #檢查80端口
            connect_port 80
            #逾時時間
            connect_timeout 2
            #重試次數
            nb_get_retry 2
            #重試間隔時間
            delay_before_retry 3
        }
    }
    real_server 192.168.1.171 80{
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}           

複制

(2)啟動/重新開機keepalived

systemctl restart keepalived           

複制

(2)使用keepalived配置Backup LVS

配置在備用機上

global_defs {
    router_id keep_152 
} 
vrrp_instance VI_1 { 
    state  BACKUP
    interface ens33 
    virtual_router_id 41 
    priority 50 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.150
    }
} 

#配置叢集通路的ip+端口,端口和nginx保持一緻
virtual_server 192.168.1.150 80{
    #健康檢查的時間,機關:秒
    delay_loop 6
    #配置負載均衡的算法,預設的輪詢
    lb_algo rr
    #設定LVS的模式 NAT|TUN|DR
    lb-kind DR
    #設定會話持久化的時間
    persistence_timeout 5
    #協定
    protocol TCP
    
    #配置負載均衡的真實伺服器,也就是nginx節點的具體的ip位址
    real_server 192.168.1.171 80{
        #輪詢權重配比
        weight 1
        #設定健康檢查
        TCP_CHECK {
            #檢查80端口
            connect_port 80
            #逾時時間
            connect_timeout 2
            #重試次數
            nb_get_retry 2
            #重試間隔時間
            delay_before_retry 3
        }
    }
    real_server 192.168.1.171 80{
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}           

複制