欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

Nginx概述

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

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

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

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

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

Nginx的特點(diǎn):

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

Nginx作用

正向代理

在這里插入圖片描述

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

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

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

反向代理

在這里插入圖片描述

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

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

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

負(fù)載均衡

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

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

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

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

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

動靜分離

在這里插入圖片描述

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

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

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

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

4、動態(tài)服務(wù)器,其種類比較繁多,可以是Apache、Tomcat、IIS以及其它Web服務(wù)器,它們一般分別隸屬于一臺服務(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的錯誤日志存放的位置

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:將接收到的請求根據(jù)/usr/share/nginx/html去查找靜態(tài)資源
		# index: 默認(rèn)去上述的路徑中找到index.html或者index.htm
    }
	# server塊
	# listen: 代表Nginx監(jiān)聽的端口號
	# localhost:代表Nginx接收請求的ip
}
# http塊
# include代表引入一個外部的文件 -> /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)安裝完畢,下面來安裝nginx

4、安裝nginx

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

在這里插入圖片描述

5、安裝成功后的位置

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

在這里插入圖片描述

nginx常用命令

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

nginx配置文件

配置文件位置

在這里插入圖片描述

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

########### 每個指令必須有分號結(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;  #制定日志路徑,級別。這個設(shè)置可以放入全局塊,http塊,server塊,級別以此為: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è)置一個進(jìn)程是否同時接受多個網(wǎng)絡(luò)連接,默認(rèn)為off
    #use epoll;      #事件驅(qū)動模型,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;  #每個進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。
    keepalive_timeout 65;  #連接超時時間,默認(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; #錯誤頁
    error_page 500 https://www.jd.com; #錯誤頁
    server {
        keepalive_requests 120; #單連接請求上限次數(shù)。
        listen       4545;   #監(jiān)聽端口
        server_name  127.0.0.1;   #監(jiān)聽地址       
        location  ~*^.+$ {       #請求的url過濾,正則匹配,~為區(qū)分大小寫,~*為不區(qū)分大小寫。
           #root path;  #根目錄
           #index vv.txt;  #設(shè)置默認(rèn)頁
           proxy_pass  http://mysvr;  #請求轉(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ò)連接。有每個進(jìn)程的最大連接數(shù),選取哪種事件驅(qū)動模型處理連接請求,是否允許同時接受多個網(wǎng)路連接,開啟多個網(wǎng)絡(luò)連接序列化等。
  • http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數(shù)等。
  • server塊:配置虛擬主機(jī)的相關(guān)參數(shù),一個http中可以有多個server。
  • location塊:配置請求的路由,以及各種頁面的處理情況。

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

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

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

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

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

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

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

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

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

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

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

# 案例
# 用戶訪問訪問 http://192.168.193.88/qfjava/webdemo/index.jsp 
#會自動代理到 http://192.168.193.88:8080/webdemo/index.jsp
 location /qfjava {
   proxy_pass http://192.168.193.88:8080/;
 }

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

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

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

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

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

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

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

輪詢

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

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

權(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 模塊(第三方)來實(shí)現(xiàn)負(fù)載均衡,fair 采用的不是內(nèi)建的算法,而是可以根據(jù)頁面大小、響應(yīng)時間智能的進(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)自動上線
  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ā)場景用域名,再通過DNS進(jìn)行負(fù)載均衡 
weight:后端服務(wù)器權(quán)重,默認(rèn)為1,權(quán)重越大接收的請求越多。例:weight=5
max_fails:檢查節(jié)點(diǎn)的健康狀態(tài)并允許請求失敗的次數(shù),達(dá)到該次數(shù)就將節(jié)點(diǎn)下線。默認(rèn)為1,0表示禁止失敗嘗試。例:max_fails=2
fail_timeout:max_fails失敗次數(shù)達(dá)到限制后暫停該節(jié)點(diǎn)服務(wù)的時間,默認(rèn)是10秒。例:fail_timeout=10s
backup:熱備配置,當(dāng)服務(wù)池中所有服務(wù)器均出現(xiàn)問題后會自動上線backup服務(wù)器
down:標(biāo)志服務(wù)器不可用,不參與負(fù)載均衡。這個參數(shù)通常配合IP_HASH使用
max_conns:限制最大連接數(shù),通常對后端服務(wù)器硬件不一致的情況進(jìn)行配置

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

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

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

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

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

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

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

動態(tài)資源代理

使用proxy_pass動態(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)頁面
        }

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

root 和alias指令區(qū)

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

若按照上述配置的話,則訪問/img/目錄里面的文件時,ningx會自動去/var/www/image/目錄找文件

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

若按照這種配置的話,則訪問/img/目錄下的文件時,nginx會去/var/www/image/img/目錄下找文件

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

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

權(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)頁面
       root data;
       index index.html;
   }
}

前端頁面訪問:http://www.2105.com/rbac/login.html

后臺接口訪問:http://www.2105.com/user/page

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

Nginx高可用

什么是高可用

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

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

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

在這里插入圖片描述

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

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

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

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

Nginx如何解決高可用的

在這里插入圖片描述

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

Keepalived是什么

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

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

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

192.168.147.10(主)

192.168.147.11(備)

1、安裝keepalived

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

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

# 檢測腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執(zhí)行的腳本,檢測nginx是否啟動
    interval 2                          #(檢測腳本執(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    # 虛擬路由編號,主從要一直
    priority 100            # 優(yōu)先級,數(shù)值越大,獲取處理請求的優(yōu)先級越高
    advert_int 1            # 檢查間隔,默認(rèn)為1s(vrrp組播周期秒數(shù))
 
    track_script {
        chk_http_port            #(調(diào)用檢測腳本)
    }
    virtual_ipaddress {
        192.168.147.88                 # 定義虛擬ip(VIP),可多設(shè),每行一個
    }
}

virtual_ipaddress 里面可以配置vip,在線上通過vip來訪問服務(wù)。

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

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

檢測腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執(zhí)行的腳本,檢測nginx是否啟動
    interval 2                          #(檢測腳本執(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                # 虛擬路由編號,主從要一直
    priority 99                         # 優(yōu)先級,數(shù)值越大,獲取處理請求的優(yōu)先級越高
    advert_int 1                        # 檢查間隔,默認(rèn)為1s(vrrp組播周期秒數(shù))
  
    track_script {
        chk_http_port                   #(調(diào)用檢測腳本)
    }
    virtual_ipaddress {
        192.168.147.88                   # 定義虛擬ip(VIP),可多設(shè),每行一個
    }
}

4、檢測腳本

/usr/local/src/check_nginx_pid.sh
#檢測nginx是否啟動了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx沒有啟動就啟動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 # 腳本必須通過授權(quán),不然沒權(quán)限訪問

6、啟動keepalived

systemctl start keepalived

在這里插入圖片描述

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

1、keepalived啟動先ngixn必須是啟動成功的,否則keepalived啟動不了

2、nginx停止后keepalived也會停止

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

7、測試順序

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

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

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

Nginx的進(jìn)程模型

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

在這里插入圖片描述

在這里插入圖片描述

Master進(jìn)程

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

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

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

? kill -HUP 是用來向指定進(jìn)程發(fā)送一個HUP信號,許多程序在收到HUP信號時,會重新讀取配置文件

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

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

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

work進(jìn)程

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

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

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

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

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

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

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

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

相關(guān)文章

  • nginx配置限制同一個ip的訪問頻率方法

    nginx配置限制同一個ip的訪問頻率方法

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

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

    Nginx 502 Bad Gateway的含義是請求的PHP-CGI已經(jīng)執(zhí)行,但是由于某種原因(一般是讀取資源的問題)沒有執(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)化詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Windows系統(tǒng)中Nginx下載安裝部署教程(實(shí)測有效)

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

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

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

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

    Nginx配置支持ThinkPHP的PATH_INFO

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

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

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

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

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

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

    本文主要介紹了生成自簽名根證書和應(yīng)用證書,部署Nginx WebDAV服務(wù),并解決瀏覽器訪問網(wǎng)頁驗(yàn)證證書域名的問題,下面就來介紹一下,感興趣的可以了解一下
    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

最新評論