五、配置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、實作雙機主備高可用
(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
}
}
}
複制