亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Nginx實(shí)現(xiàn)負(fù)載均衡和反向代理的方法

 更新時(shí)間:2024年02月29日 09:21:55   作者:失重外太空.  
Nginx是由俄羅斯人研發(fā)的,應(yīng)對(duì)Rambler的網(wǎng)站,并且2004年發(fā)布的第一個(gè)版本,Nginx功能豐富,可作為HTTP服務(wù)器,也可作為反向代理服務(wù)器,郵件服務(wù)器,本文給大家介紹了Nginx實(shí)現(xiàn)負(fù)載均衡和反向代理的方法,需要的朋友可以參考下

Nginx概述

http://nginx.org/en/download.html

Nginx是由俄羅斯人研發(fā)的,應(yīng)對(duì)Rambler的網(wǎng)站,并且2004年發(fā)布的第一個(gè)版本。

Nginx是lgor Sysoev為俄羅斯訪問(wèn)量第二的rambler.ru站點(diǎn)設(shè)計(jì)開(kāi)發(fā)的。從2004年發(fā)布至今,憑借開(kāi)源的力量,已經(jīng)接近成熟與完善。

Nginx功能豐富,可作為HTTP服務(wù)器,也可作為反向代理服務(wù)器,郵件服務(wù)器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模塊擴(kuò)展。

Nginx的穩(wěn)定性、功能集、示例配置文件和低系統(tǒng)資源的消耗讓他后來(lái)居上,在全球活躍的網(wǎng)站中有12.18%的使用比率,大約為2220萬(wàn)個(gè)網(wǎng)站。

Nginx的特點(diǎn):

  • 穩(wěn)定性極強(qiáng)。 7*24小時(shí)不間斷運(yùn)行。
  • Nginx提供了非常豐富的配置實(shí)例。
  • 占用內(nèi)存小,并發(fā)能力強(qiáng)(官方給的數(shù)據(jù)是5w)
  • 負(fù)載均衡策略
  • 動(dòng)靜態(tài)分離
    • 擅長(zhǎng)處理靜態(tài)資源,tomcat擅長(zhǎng)處理動(dòng)態(tài)資源

Nginx作用

正向代理

在這里插入圖片描述

正向代理是給客戶端做代理,客戶端清楚要訪問(wèn)的目標(biāo)服務(wù)器。

正向代理服務(wù)器作用如下

  • 訪問(wèn)原來(lái)無(wú)法訪問(wèn)的資源
  • 用作緩存,加速訪問(wèn)速度
  • 對(duì)客戶端訪問(wèn)授權(quán),上網(wǎng)進(jìn)行認(rèn)證
  • 代理可以記錄用戶訪問(wèn)記錄(上網(wǎng)行為管理),對(duì)外隱藏用戶信息

反向代理

在這里插入圖片描述

反向代理給服務(wù)端做代理,客戶但不知道要訪問(wèn)那臺(tái)服務(wù)器。

反向代理服務(wù)器作用如下:

  • 保護(hù)內(nèi)網(wǎng)安全
  • 負(fù)載均衡
  • 緩存,減少服務(wù)器的壓力

負(fù)載均衡

將多個(gè)請(qǐng)求均勻的分配到多臺(tái)服務(wù)器上,減輕每臺(tái)服務(wù)器的壓力,提高服務(wù)的吞吐量。

Nginx提供的負(fù)載均衡策略有2種:

內(nèi)置策略:輪詢,權(quán)重,Ip hash。

擴(kuò)展策略:fair(會(huì)根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,以實(shí)現(xiàn)更加均衡的負(fù)載分配。fair策略會(huì)優(yōu)先將請(qǐng)求發(fā)送到響應(yīng)時(shí)間較短的服務(wù)器上,從而提高整體性能和穩(wěn)定性。)

Ip hash算法:對(duì)客戶端請(qǐng)求的ip進(jìn)行hash操作,然后根據(jù)hash結(jié)果將同一個(gè)客戶端ip的請(qǐng)求分發(fā)給同一臺(tái)服務(wù)器進(jìn)行處理,可以解決session不共享的問(wèn)題

動(dòng)靜分離

在這里插入圖片描述

? 動(dòng)靜分離是指在web服務(wù)器架構(gòu)中,將靜態(tài)頁(yè)面與動(dòng)態(tài)頁(yè)面或者靜態(tài)內(nèi)容接口和動(dòng)態(tài)內(nèi)容接口分開(kāi)不同系統(tǒng)訪問(wèn)的架構(gòu)設(shè)計(jì)方法,進(jìn)而提升整個(gè)服務(wù)訪問(wèn)性能和可維護(hù)性。

1、代理服務(wù)器和靜態(tài)服務(wù)器即為一臺(tái)服務(wù)器上,這里只是為了明顯區(qū)分動(dòng)靜分離所處服務(wù)器的不同;

2、靜態(tài)服務(wù)器中,存放的資源主要是源代碼文件、圖片、屬性、樣式以及其它所有非動(dòng)態(tài)的資源文件;

3、調(diào)度規(guī)則,即為代理服務(wù)器,這里是Nginx的服務(wù)器調(diào)度規(guī)則;

4、動(dòng)態(tài)服務(wù)器,其種類比較繁多,可以是Apache、Tomcat、IIS以及其它Web服務(wù)器,它們一般分別隸屬于一臺(tái)服務(wù)器;

Nginx的安裝 -->Docker

安裝Nginx

使用Docker-Compose安裝

version: '3.1'
services:
  nginx:
    restart: always
    image: daocloud.io/library/nginx:latest
    container_name: nginx
    ports:
      - 80:80

Nginx的配置文件

關(guān)于Nginx的核心配置文件nginx.conf

worker_processes  1;		
error_log  /var/log/nginx/error.log warn;
# 以上統(tǒng)稱為全局塊, 
# worker_processes他的數(shù)值越大,Nginx的并發(fā)能力就越強(qiáng)
# error_log 代表Nginx的錯(cuò)誤日志存放的位置

events {
    worker_connections  1024;
}
# events塊
# worker_connections他的數(shù)值越大,Nignx并發(fā)能力越強(qiáng)

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
		# location塊
		# root:將接收到的請(qǐng)求根據(jù)/usr/share/nginx/html去查找靜態(tài)資源
		# index: 默認(rèn)去上述的路徑中找到index.html或者index.htm
    }
	# server塊
	# listen: 代表Nginx監(jiān)聽(tīng)的端口號(hào)
	# localhost:代表Nginx接收請(qǐng)求的ip
}
# http塊
# include代表引入一個(gè)外部的文件 -> /mime.types中放著大量的媒體類型
# include /etc/nginx/conf.d/*.conf; -> 引入了conf.d目錄下的以.conf為結(jié)尾的配置文件

修改docker-compose文件

為了方便修改Nginx配置,修改yml文件

version: '3.1'
services:
  nginx:
    restart: always
    image: daocloud.io/library/nginx:latest
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - /opt/docker_nginx/conf.d/:/etc/nginx/conf.d

Nginx源碼安裝

1、下載nginx源碼包

wget http://nginx.org/download/nginx-1.20.1.tar.gz

2、解壓

tar -zxf nginx-1.20.1.tar.gz 

3、安裝c/c++的編譯器

yum install gcc
yum install gcc-c++
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

因?yàn)橄螺d的包是源碼包,需要編譯,安裝后才能使用。而nginx是c寫的,因此需要安裝c/c++的編譯器

在這里插入圖片描述

在這里插入圖片描述

如上,gcc已經(jīng)安裝完畢,下面來(lái)安裝nginx

4、安裝nginx

1、進(jìn)入nginx目錄
2、 ./configure 
3、make install

在這里插入圖片描述

5、安裝成功后的位置

nginx默認(rèn)會(huì)按照在/usr/local/nginx中

在這里插入圖片描述

nginx常用命令

./nginx 啟動(dòng)
./nginx -s stop 停止
./nginx -s reload 重啟(重新加載nginx配置文件)
./nginx -v 查看nginx版本號(hào)

nginx配置文件

配置文件位置

在這里插入圖片描述

配置文件結(jié)構(gòu)詳情

########### 每個(gè)指令必須有分號(hào)結(jié)束。#################
#user administrator administrators;  #配置用戶或者組,默認(rèn)為nobody nobody。
worker_processes 1;  #允許生成的進(jìn)程數(shù),默認(rèn)為1
#pid /nginx/pid/nginx.pid;   #指定nginx進(jìn)程運(yùn)行文件存放地址
error_log log/error.log debug;  #制定日志路徑,級(jí)別。這個(gè)設(shè)置可以放入全局塊,http塊,server塊,級(jí)別以此為:debug|info|notice|warn|error|crit|alert|emerg

events {
    accept_mutex on;   #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on
    multi_accept on;  #設(shè)置一個(gè)進(jìn)程是否同時(shí)接受多個(gè)網(wǎng)絡(luò)連接,默認(rèn)為off
    #use epoll;      #事件驅(qū)動(dòng)模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連接數(shù),默認(rèn)為512
}

http {
    include       mime.types;   #文件擴(kuò)展名與文件類型映射表
    default_type  application/octet-stream; #默認(rèn)文件類型,默認(rèn)為text/plain
    #access_log off; #取消服務(wù)日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為日志格式的默認(rèn)值
    sendfile on;   #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。
    sendfile_max_chunk 100k;  #每個(gè)進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。
    keepalive_timeout 65;  #連接超時(shí)時(shí)間,默認(rèn)為75s,可以在http,server,location塊。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯(cuò)誤頁(yè)
    error_page 500 https://www.jd.com; #錯(cuò)誤頁(yè)
    server {
        keepalive_requests 120; #單連接請(qǐng)求上限次數(shù)。
        listen       4545;   #監(jiān)聽(tīng)端口
        server_name  127.0.0.1;   #監(jiān)聽(tīng)地址       
        location  ~*^.+$ {       #請(qǐng)求的url過(guò)濾,正則匹配,~為區(qū)分大小寫,~*為不區(qū)分大小寫。
           #root path;  #根目錄
           #index vv.txt;  #設(shè)置默認(rèn)頁(yè)
           proxy_pass  http://mysvr;  #請(qǐng)求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}
1、全局塊
2、events塊
3、http塊
	a)server塊
		1)location塊
  • 全局塊:配置影響nginx全局的指令。一般有運(yùn)行nginx服務(wù)器的用戶組,nginx進(jìn)程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數(shù)等。
  • events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個(gè)進(jìn)程的最大連接數(shù),選取哪種事件驅(qū)動(dòng)模型處理連接請(qǐng)求,是否允許同時(shí)接受多個(gè)網(wǎng)路連接,開(kāi)啟多個(gè)網(wǎng)絡(luò)連接序列化等。
  • http塊:可以嵌套多個(gè)server,配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時(shí)時(shí)間,單連接請(qǐng)求數(shù)等。
  • server塊:配置虛擬主機(jī)的相關(guān)參數(shù),一個(gè)http中可以有多個(gè)server。
  • location塊:配置請(qǐng)求的路由,以及各種頁(yè)面的處理情況。

Nginx的反向代理【重點(diǎn)】

基于Nginx實(shí)現(xiàn)反向代理

準(zhǔn)備一個(gè)目標(biāo)服務(wù)器。

啟動(dòng)了之前的tomcat服務(wù)器。

編寫default.conf配置文件,通過(guò)Nginx訪問(wèn)到tomcat服務(wù)器。

# 監(jiān)聽(tīng)80端口
server{
  listen 80;
  server_name localhost;
    # 基于反向代理訪問(wèn)到Tomcat服務(wù)器
  location / {
    proxy_pass http://192.168.199.109:8081/;
  }
}

關(guān)于Nginx的location路徑映射

優(yōu)先級(jí)關(guān)系如下:

(location=) > (location /aa/bb/cc) > (location ~)

# 1. 精確匹配
location = / {
  # 精準(zhǔn)匹配,主機(jī)名后面不能帶任何的字符串,等號(hào)決定匹配的內(nèi)容,比如:http://baidu.com
}
# 案例
# 用戶訪問(wèn)# http:192.168.193.88/abc nginx
#會(huì)自動(dòng)代理到 http://192.168.193.88:8080/
location =/abc {  
  proxy_pass http://192.168.193.88:8080/;
}

# 2. 通用匹配
location /xxx {
  # 匹配所有以/xxx開(kāi)頭的路徑,比如:http://baidu.com/xxx
}

# 案例
# 用戶訪問(wèn)訪問(wèn) http://192.168.193.88/qfjava/webdemo/index.jsp 
#會(huì)自動(dòng)代理到 http://192.168.193.88:8080/webdemo/index.jsp
 location /qfjava {
   proxy_pass http://192.168.193.88:8080/;
 }

# 3. 正則匹配
location ~ /xxx {
  # 匹配所有以/xxx開(kāi)頭的路徑
}

# 4. 匹配開(kāi)頭路徑
location ^~ /images/ {
  # 匹配所有以/images開(kāi)頭的路徑
}

# 5. 匹配后綴
location ~* \.(gif|jpg|png)$ {
  # 匹配以gif或者jpg或者png為結(jié)尾的路徑
}

# 6. 全部通配
location / {
  # 匹配全部路徑  
}

Nginx負(fù)載均衡【重點(diǎn)】

Nginx為我們默認(rèn)提供了三種負(fù)載均衡的策略:

  • 輪詢:將客戶端發(fā)起的請(qǐng)求,平均的分配給每一臺(tái)服務(wù)器
  • 權(quán)重:會(huì)將客戶端的請(qǐng)求,根據(jù)服務(wù)器的權(quán)重值不同,分配不同的數(shù)量。
  • ip_hash:基于發(fā)起請(qǐng)求的客戶端的ip地址不同,他始終會(huì)將請(qǐng)求發(fā)送到指定的服務(wù)器上。

輪詢

想實(shí)現(xiàn)Nginx輪詢負(fù)載均衡機(jī)制只需要在配置文件中添加以下內(nèi)容

upstream 名字 { # 給空格
  server ip:port; # 給分號(hào)  server 192.168.193.66:8080
  server ip:port;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/; # 給分號(hào)
  }
}

權(quán)重

實(shí)現(xiàn)權(quán)重的方式

# 名字中不要出現(xiàn)下?lián)Q線
upstream 名字 { 
  server ip:port weight=權(quán)重比例; # server 192.168.193.66:8080 weight=8;
  server ip:port weight=權(quán)重比例; # server 192.168.193.66:8080 weight=2;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

ip_hash

ip_hash實(shí)現(xiàn)

upstream 名字 {
  ip_hash;
  server ip:port;
  server ip:port;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

fair

fair 模塊(第三方)來(lái)實(shí)現(xiàn)負(fù)載均衡,fair 采用的不是內(nèi)建的算法,而是可以根據(jù)頁(yè)面大小、響應(yīng)時(shí)間智能的進(jìn)行負(fù)載均衡。

upstream 名字 {
  server ip:port;
  server ip:port;
  fair;
}
server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

upstream模塊中的常用參數(shù)

upstream linuxe_backend {
  server 192.168.1.110 down;  #該節(jié)點(diǎn)不可用
  server 192.168.1.120 backup;  #其他節(jié)點(diǎn)掛了后該節(jié)點(diǎn)自動(dòng)上線
  server 192.168.1.130 max_failes=1 fail_timeout=10s weight=5;
  server backend1.linuxe.cn 8080 weight=3 max_conns=10;
}
server:負(fù)載均衡后端服務(wù)器的IP或域名,不寫端口的話默認(rèn)是80。高并發(fā)場(chǎng)景用域名,再通過(guò)DNS進(jìn)行負(fù)載均衡 
weight:后端服務(wù)器權(quán)重,默認(rèn)為1,權(quán)重越大接收的請(qǐng)求越多。例:weight=5
max_fails:檢查節(jié)點(diǎn)的健康狀態(tài)并允許請(qǐng)求失敗的次數(shù),達(dá)到該次數(shù)就將節(jié)點(diǎn)下線。默認(rèn)為1,0表示禁止失敗嘗試。例:max_fails=2
fail_timeout:max_fails失敗次數(shù)達(dá)到限制后暫停該節(jié)點(diǎn)服務(wù)的時(shí)間,默認(rèn)是10秒。例:fail_timeout=10s
backup:熱備配置,當(dāng)服務(wù)池中所有服務(wù)器均出現(xiàn)問(wèn)題后會(huì)自動(dòng)上線backup服務(wù)器
down:標(biāo)志服務(wù)器不可用,不參與負(fù)載均衡。這個(gè)參數(shù)通常配合IP_HASH使用
max_conns:限制最大連接數(shù),通常對(duì)后端服務(wù)器硬件不一致的情況進(jìn)行配置

Nginx動(dòng)靜分離【重點(diǎn)】

動(dòng)靜分離是指在web服務(wù)器架構(gòu)中,將靜態(tài)頁(yè)面與動(dòng)態(tài)頁(yè)面或者靜態(tài)內(nèi)容接口和動(dòng)態(tài)內(nèi)容接口分開(kāi)不同系統(tǒng)訪問(wèn)的架構(gòu)設(shè)計(jì)方法,進(jìn)而提升整個(gè)服務(wù)訪問(wèn)性能和可維護(hù)性。

動(dòng):必須依賴服務(wù)器返回,比如Controller,數(shù)據(jù)庫(kù)相關(guān)操作。
靜:不需要依賴容器的比如css/js/html或者圖片等文件

Nginx的并發(fā)能力公式:

? worker_processes * worker_connections / 4 | 2 = Nginx最終的并發(fā)能力

動(dòng)態(tài)資源需要/4,靜態(tài)資源需要/2.

Nginx通過(guò)動(dòng)靜分離,來(lái)提升Nginx的并發(fā)能力,更快的給用戶響應(yīng)。

動(dòng)態(tài)資源代理

使用proxy_pass動(dòng)態(tài)代理

# 配置如下
location / {
  proxy_pass 服務(wù)器的路徑;
}

靜態(tài)資源代理

使用root或者alias靜態(tài)代理

server{
        listen 80;
        server_name localhost;

        location /html {
                root data; // 在data/html下面找文件
                index a.html; # 配置默認(rèn)頁(yè)面
        }

        location /images {
                root data; // 在data/images下面找文件
                autoindex on; # 地址欄訪問(wèn) http://192.168.193.88/images/
        }
}

root 和alias指令區(qū)

location /img/ {
    alias /var/www/image/;
}

若按照上述配置的話,則訪問(wèn)/img/目錄里面的文件時(shí),ningx會(huì)自動(dòng)去/var/www/image/目錄找文件

location /img/ {
    root /var/www/image;
}

若按照這種配置的話,則訪問(wèn)/img/目錄下的文件時(shí),nginx會(huì)去/var/www/image/img/目錄下找文件

alias是一個(gè)目錄別名的定義,root則是最上層目錄的定義。

還有一個(gè)重要的區(qū)別是alias后面必須要用“/”結(jié)束,否則會(huì)找不到文件的。。。而root則可有可無(wú)

權(quán)限項(xiàng)目部署

 # 權(quán)限服務(wù)器集群
upstream rbac {
    server 172.30.77.207:8082;
    server 172.30.77.207:8083;
}

server {
  listen       80;
  server_name  localhost;
       
  location / {   # 反向代理到后端服務(wù)器
       proxy_pass http://rbac;
  }

  location /rbac {  # 權(quán)限項(xiàng)目前端相關(guān)靜態(tài)頁(yè)面
       root data;
       index index.html;
   }
}

前端頁(yè)面訪問(wèn):http://www.2105.com/rbac/login.html

后臺(tái)接口訪問(wèn):http://www.2105.com/user/page

后臺(tái)接口取消上下文路徑,多個(gè)應(yīng)用可以根據(jù)端口號(hào)或者location來(lái)區(qū)分。

Nginx高可用

什么是高可用

高可用HA(High Availability)是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它通常是指,通過(guò)設(shè)計(jì)減少系統(tǒng)不能提供服務(wù)的時(shí)間。

假設(shè)系統(tǒng)一直能夠提供服務(wù),我們說(shuō)系統(tǒng)的可用性是100%。

如果系統(tǒng)每運(yùn)行100個(gè)時(shí)間單位,會(huì)有1個(gè)時(shí)間單位無(wú)法提供服務(wù),我們說(shuō)系統(tǒng)的可用性是99%。很多公司的高可用目標(biāo)是4個(gè)9,也就是99.99%,這就意味著,系統(tǒng)的年停機(jī)時(shí)間為8.76個(gè)小時(shí)。

在這里插入圖片描述

在生產(chǎn)環(huán)境上很多時(shí)候是以Nginx做反向代理對(duì)外提供服務(wù),但是一天Nginx難免遇見(jiàn)故障,如:服務(wù)器宕機(jī)。當(dāng)Nginx宕機(jī)那么所有對(duì)外提供的接口都將導(dǎo)致無(wú)法訪問(wèn)。

雙機(jī)熱備+自動(dòng)故障轉(zhuǎn)移

這種方案是國(guó)內(nèi)企業(yè)中最為普遍的一種高可用方案,雙機(jī)熱備其實(shí)就是指一臺(tái)服務(wù)器在提供服務(wù),另一臺(tái)為某服務(wù)的備用狀態(tài),當(dāng)一臺(tái)服務(wù)器不可用另外一臺(tái)就會(huì)頂替上去。

有了雙機(jī)熱備方案之后,還不夠,每次出現(xiàn)故障需要人工介入恢復(fù)勢(shì)必會(huì)增加系統(tǒng)的不可服務(wù)實(shí)踐。所以,又往往是通過(guò)自動(dòng)故障轉(zhuǎn)移來(lái)實(shí)現(xiàn)系統(tǒng)的高可用。

Nginx如何解決高可用的

在這里插入圖片描述

Nginx解決高可用需要準(zhǔn)備兩臺(tái)nginx,一個(gè)是主(Master)服務(wù)器,一個(gè)是備(backup)服務(wù)器,使用keepalived基于主和備可以創(chuàng)建出一臺(tái)虛擬服務(wù)器供客戶端調(diào)用。虛擬服務(wù)器接收到請(qǐng)求會(huì)先把請(qǐng)求交給主服務(wù)器處理,如果主服務(wù)器宕機(jī)就把請(qǐng)求交給備服務(wù)器處理。

Keepalived是什么

Keepalived軟件起初是專為LVS(Linux Virtual Server,Linux虛擬服務(wù)器)負(fù)載均衡軟件設(shè)計(jì)的,用來(lái)管理并監(jiān)控LVS集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),后來(lái)又加入了可以實(shí)現(xiàn)高可用的VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗余協(xié)議)功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(wù)(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件

Keepalived實(shí)現(xiàn)Nginx高可用

安裝前需要準(zhǔn)備好兩臺(tái)虛擬器,兩臺(tái)都需要安裝nginx和keepalived。

192.168.147.10(主)

192.168.147.11(備)

1、安裝keepalived

yum -y install keepalived # 配置文件在/etc/keepalived/keepalived.conf

2、修改主服務(wù)器keepalived.conf

# 檢測(cè)腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執(zhí)行的腳本,檢測(cè)nginx是否啟動(dòng)
    interval 2                          #(檢測(cè)腳本執(zhí)行的間隔,單位是秒)
    weight 2                            #權(quán)重
}
#vrrp 實(shí)例定義部分
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface ens33         # 當(dāng)前進(jìn)行vrrp通訊的網(wǎng)絡(luò)接口卡(當(dāng)前centos的網(wǎng)卡) 用ifconfig查看你具體的網(wǎng)卡
    virtual_router_id 66    # 虛擬路由編號(hào),主從要一直
    priority 100            # 優(yōu)先級(jí),數(shù)值越大,獲取處理請(qǐng)求的優(yōu)先級(jí)越高
    advert_int 1            # 檢查間隔,默認(rèn)為1s(vrrp組播周期秒數(shù))
 
    track_script {
        chk_http_port            #(調(diào)用檢測(cè)腳本)
    }
    virtual_ipaddress {
        192.168.147.88                 # 定義虛擬ip(VIP),可多設(shè),每行一個(gè)
    }
}

virtual_ipaddress 里面可以配置vip,在線上通過(guò)vip來(lái)訪問(wèn)服務(wù)。

interface需要根據(jù)服務(wù)器網(wǎng)卡進(jìn)行設(shè)置通常查看方式ip addr

3、修改備服務(wù)器配置文件

檢測(cè)腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執(zhí)行的腳本,檢測(cè)nginx是否啟動(dòng)
    interval 2                          #(檢測(cè)腳本執(zhí)行的間隔)
    weight 2                            #權(quán)重
}
#vrrp 實(shí)例定義部分
vrrp_instance VI_1 {
    state BACKUP                        # 指定keepalived的角色,MASTER為主,BACKUP為備
    interface ens33                      # 當(dāng)前進(jìn)行vrrp通訊的網(wǎng)絡(luò)接口卡(當(dāng)前centos的網(wǎng)卡) 用ifconfig查看你具體的網(wǎng)卡
    virtual_router_id 66                # 虛擬路由編號(hào),主從要一直
    priority 99                         # 優(yōu)先級(jí),數(shù)值越大,獲取處理請(qǐng)求的優(yōu)先級(jí)越高
    advert_int 1                        # 檢查間隔,默認(rèn)為1s(vrrp組播周期秒數(shù))
  
    track_script {
        chk_http_port                   #(調(diào)用檢測(cè)腳本)
    }
    virtual_ipaddress {
        192.168.147.88                   # 定義虛擬ip(VIP),可多設(shè),每行一個(gè)
    }
}

4、檢測(cè)腳本

/usr/local/src/check_nginx_pid.sh
#檢測(cè)nginx是否啟動(dòng)了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx沒(méi)有啟動(dòng)就啟動(dòng)nginx                        
      systemctl start nginx                #重啟nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重啟失敗,則停掉keepalived服務(wù),進(jìn)行VIP轉(zhuǎn)移
              killall keepalived                    
      fi
fi

5、腳本授權(quán)

chmod 700 check_nginx_pid.sh # 腳本必須通過(guò)授權(quán),不然沒(méi)權(quán)限訪問(wèn)

6、啟動(dòng)keepalived

systemctl start keepalived

在這里插入圖片描述

搭建高可用需要注意一下幾點(diǎn)

1、keepalived啟動(dòng)先ngixn必須是啟動(dòng)成功的,否則keepalived啟動(dòng)不了

2、nginx停止后keepalived也會(huì)停止

3、主宕機(jī)后啟動(dòng)順序是先啟動(dòng)nginx,在啟動(dòng)keepalived

7、測(cè)試順序

1、主備都啟動(dòng)時(shí)訪問(wèn)速虛擬主機(jī)請(qǐng)求會(huì)交給主處理
2、把主中的nginx關(guān)閉后,請(qǐng)求會(huì)交給備服務(wù)器處理

Keepalived實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移

Keepalived高可用服務(wù)之間的故障切換轉(zhuǎn)移,是通過(guò)VRRP 來(lái)實(shí)現(xiàn)的。
Keepalived服務(wù)正常工作時(shí),主 Master節(jié)點(diǎn)會(huì)不斷地向備節(jié)點(diǎn)發(fā)送(多播的方式)心跳消息,用以告訴備Backup節(jié)點(diǎn)自己還活著,當(dāng)主 Master節(jié)點(diǎn)發(fā)生故障時(shí),就無(wú)法發(fā)送心跳消息,備節(jié)點(diǎn)也就因此無(wú)法繼續(xù)檢測(cè)到來(lái)自主 Master節(jié)點(diǎn)的心跳了,于是調(diào)用自身的接管程序,接管主Master節(jié)點(diǎn)的 IP資源及服務(wù)。而當(dāng)主 Master節(jié)點(diǎn)恢復(fù)時(shí),備Backup節(jié)點(diǎn)又會(huì)釋放主節(jié)點(diǎn)故障時(shí)自身接管的IP資源及服務(wù),恢復(fù)到原來(lái)的備用角色。

Nginx的進(jìn)程模型

Nginx啟動(dòng)成功默認(rèn)會(huì)有兩個(gè)進(jìn)程,master和work。

在這里插入圖片描述

在這里插入圖片描述

Master進(jìn)程

master進(jìn)程主要用來(lái)管理worker進(jìn)程,具體包括如下4個(gè)主要功能:
1、接收來(lái)自外界的信號(hào)。
2、向各worker進(jìn)程發(fā)送信號(hào)。
3、監(jiān)控woker進(jìn)程的運(yùn)行狀態(tài)。
4、當(dāng)woker進(jìn)程退出后(異常情況下),會(huì)自動(dòng)重新啟動(dòng)新的woker進(jìn)程
5、熱加載ngixn配置文件

master進(jìn)程充當(dāng)整個(gè)進(jìn)程組與用戶的交互接口,同時(shí)對(duì)進(jìn)程進(jìn)行監(jiān)護(hù)。它不需要處理網(wǎng)絡(luò)事件,不負(fù)責(zé)業(yè)務(wù)的執(zhí)行,只會(huì)通過(guò)管理worker進(jìn)程來(lái)實(shí)現(xiàn)重啟服務(wù)、平滑升級(jí)、更換日志文件、配置文件實(shí)時(shí)生效等功能。

? 我們要控制nginx,只需要通過(guò)kill向master進(jìn)程發(fā)送信號(hào)就行了。比如kill -HUP pid,則是告訴nginx,從容地重啟nginx,我們一般用這個(gè)信號(hào)來(lái)重啟nginx,或重新加載配置,因?yàn)槭菑娜莸刂貑?,因此服?wù)是不中斷的。

? kill -HUP 是用來(lái)向指定進(jìn)程發(fā)送一個(gè)HUP信號(hào),許多程序在收到HUP信號(hào)時(shí),會(huì)重新讀取配置文件

master進(jìn)程在接收到HUP信號(hào)后是怎么做的呢?

1)首先master進(jìn)程在接到信號(hào)后,會(huì)先重新加載配置文件,然后再啟動(dòng)新的worker進(jìn)程,并向所有老的worker進(jìn)程發(fā)送信號(hào),告訴他們可以光榮退休了。

2)新的worker在啟動(dòng)后,就開(kāi)始接收新的請(qǐng)求,而老的worker在收到來(lái)自master的信號(hào)后,就不再接收新的請(qǐng)求,并且在當(dāng)前進(jìn)程中的所有未處理完的請(qǐng)求處理完成后,再退出。

work進(jìn)程

? work進(jìn)程主要用來(lái)處理網(wǎng)絡(luò)請(qǐng)求,像網(wǎng)絡(luò)事件,則是放在worker進(jìn)程中來(lái)處理了。多個(gè)worker進(jìn)程之間是對(duì)等的,他們同等競(jìng)爭(zhēng)來(lái)自客戶端的請(qǐng)求,各進(jìn)程互相之間是獨(dú)立的。一個(gè)請(qǐng)求,只可能在一個(gè)worker進(jìn)程中處理,一個(gè)worker進(jìn)程,不可能處理其它進(jìn)程的請(qǐng)求。worker進(jìn)程的個(gè)數(shù)是可以設(shè)置的(默認(rèn)是1),一般我們會(huì)設(shè)置與機(jī)器cpu核數(shù)一致,這里面的原因與nginx的進(jìn)程模型以及事件處理模型是分不開(kāi)的。

? worker進(jìn)程之間是平等的,每個(gè)進(jìn)程,處理請(qǐng)求的機(jī)會(huì)也是一樣的

當(dāng)我們提供80端口的http服務(wù)時(shí),一個(gè)連接請(qǐng)求過(guò)來(lái),每個(gè)work進(jìn)程都有可能處理這個(gè)連接,怎么做到的呢?

Nginx采用異步非阻塞的方式來(lái)處理網(wǎng)絡(luò)事件,類似于Libevent,具體過(guò)程如下:

1)接收請(qǐng)求:首先,每個(gè)worker進(jìn)程都是從master進(jìn)程fork過(guò)來(lái),在master進(jìn)程建立好需要listen的socket(listenfd)之后,然后再fork出多個(gè)worker進(jìn)程。所有worker進(jìn)程的listenfd會(huì)在新連接到來(lái)時(shí)變得可讀,每個(gè)work進(jìn)程都可以去accept這個(gè)socket(listenfd)。當(dāng)一個(gè)client連接到來(lái)時(shí),所有accept的work進(jìn)程都會(huì)受到通知,但只有一個(gè)進(jìn)程可以accept成功,其它的則會(huì)accept失敗。為保證只有一個(gè)進(jìn)程處理該連接,Nginx提供了一把共享鎖accept_mutex來(lái)保證同一時(shí)刻只有一個(gè)work進(jìn)程在accept連接。所有worker進(jìn)程在注冊(cè)listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個(gè)進(jìn)程注冊(cè)listenfd讀事件,在讀事件里調(diào)用accept接受該連接。

2)處理請(qǐng)求:當(dāng)一個(gè)worker進(jìn)程在accept這個(gè)連接之后,就開(kāi)始讀取請(qǐng)求,解析請(qǐng)求,處理請(qǐng)求,產(chǎn)生數(shù)據(jù)后,再返回給客戶端,最后才斷開(kāi)連接,這樣一個(gè)完整的請(qǐng)求就是這樣的了。

? 我們可以看到,一個(gè)請(qǐng)求,完全由worker進(jìn)程來(lái)處理,而且只在一個(gè)worker進(jìn)程中處理。worker進(jìn)程之間是平等的,每個(gè)進(jìn)程,處理請(qǐng)求的機(jī)會(huì)也是一樣的。

以上就是Nginx實(shí)現(xiàn)負(fù)載均衡和反向代理的方法的詳細(xì)內(nèi)容,更多關(guān)于Nginx負(fù)載均衡和反向代理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • nginx配置限制同一個(gè)ip的訪問(wèn)頻率方法

    nginx配置限制同一個(gè)ip的訪問(wèn)頻率方法

    今天小編就為大家分享一篇nginx配置限制同一個(gè)ip的訪問(wèn)頻率方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Nginx 502 bad gateway和Nginx 504 Gateway Time-out錯(cuò)誤解決方法 錯(cuò)誤解決辦法

    Nginx 502 bad gateway和Nginx 504 Gateway Time-out錯(cuò)誤解決方法 錯(cuò)誤解決辦

    Nginx 502 Bad Gateway的含義是請(qǐng)求的PHP-CGI已經(jīng)執(zhí)行,但是由于某種原因(一般是讀取資源的問(wèn)題)沒(méi)有執(zhí)行完畢而導(dǎo)致PHP-CGI進(jìn)程終止
    2012-09-09
  • 淺談Nginx10m+高并發(fā)內(nèi)核優(yōu)化詳解

    淺談Nginx10m+高并發(fā)內(nèi)核優(yōu)化詳解

    這篇文章主要介紹了淺談Nginx10m+高并發(fā)內(nèi)核優(yōu)化詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • Windows系統(tǒng)中Nginx下載安裝部署教程(實(shí)測(cè)有效)

    Windows系統(tǒng)中Nginx下載安裝部署教程(實(shí)測(cè)有效)

    Nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,也是一個(gè)IMAP/POP3/SMTP代理服務(wù)器,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)中Nginx下載安裝部署的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 淺談Nginx請(qǐng)求限制和訪問(wèn)控制的實(shí)現(xiàn)

    淺談Nginx請(qǐng)求限制和訪問(wèn)控制的實(shí)現(xiàn)

    這篇文章主要介紹了淺談Nginx請(qǐng)求限制和訪問(wèn)控制的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Nginx配置支持ThinkPHP的PATH_INFO

    Nginx配置支持ThinkPHP的PATH_INFO

    這篇文章主要介紹了Nginx配置支持ThinkPHP的PATH_INFO,本文在Ubuntu的開(kāi)發(fā)環(huán)境加配置成功,需要的朋友可以參考下
    2015-07-07
  • Nginx實(shí)現(xiàn)負(fù)載均衡和反向代理的方法

    Nginx實(shí)現(xiàn)負(fù)載均衡和反向代理的方法

    Nginx是由俄羅斯人研發(fā)的,應(yīng)對(duì)Rambler的網(wǎng)站,并且2004年發(fā)布的第一個(gè)版本,Nginx功能豐富,可作為HTTP服務(wù)器,也可作為反向代理服務(wù)器,郵件服務(wù)器,本文給大家介紹了Nginx實(shí)現(xiàn)負(fù)載均衡和反向代理的方法,需要的朋友可以參考下
    2024-02-02
  • nginx的語(yǔ)法(基本語(yǔ)法和組成部分)

    nginx的語(yǔ)法(基本語(yǔ)法和組成部分)

    Nginx是一個(gè)高效、穩(wěn)定的開(kāi)源Web服務(wù)器和反向代理服務(wù)器,也可以用作郵件代理服務(wù)器、負(fù)載均衡器和HTTP緩存,很多人都選擇nginx作為web服務(wù)器使用,下面是Nginx配置文件的一些基本語(yǔ)法和組成部分,使用Nginx的朋友可以了解一下
    2023-05-05
  • Nginx搭建Webdav服務(wù)的方法步驟

    Nginx搭建Webdav服務(wù)的方法步驟

    本文主要介紹了生成自簽名根證書和應(yīng)用證書,部署Nginx WebDAV服務(wù),并解決瀏覽器訪問(wèn)網(wǎng)頁(yè)驗(yàn)證證書域名的問(wèn)題,下面就來(lái)介紹一下,感興趣的可以了解一下
    2024-12-12
  • Nginx反向代理在Web應(yīng)用中的實(shí)戰(zhàn)分享

    Nginx反向代理在Web應(yīng)用中的實(shí)戰(zhàn)分享

    本文將介紹Nginx反向代理的基本原理和配置,以及如何利用Nginx實(shí)現(xiàn)高可用性和故障轉(zhuǎn)移,最后,我們將探討如何監(jiān)控Nginx反向代理的性能并進(jìn)行日志分析,需要的朋友可以參考下
    2024-08-08

最新評(píng)論