主頁 > 後端開發 > 學習nginx,這一篇就夠了

學習nginx,這一篇就夠了

2022-07-04 17:33:36 後端開發

一 、nginx介紹

1.簡介

Nginx 是高性能的 HTTP 和反向代理的web服務器,處理高并發能力是十分強大的,能經受高負 載的考驗,有報告表明能支持高達 50,000 個并發連接數,

2.正向代理

用正向代理來進行上網等功能, 正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪 問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理,

通過代理服務器來訪問真實服務器的程序 就叫正向代理,正向代理需要在客戶端進行配置代理服務器

img

例如,我們用的vpn ,國內直接訪問不了google , 通過vpn的服務器代理我們訪問對應的站點,就可以訪問

3.反向代理

反向代理 是代理服務器端, 當客戶端發送請求時,請求先到代理服務器,代理服務器再把請求選擇發送到目標服務器,代理服務器獲取目標服務器的資料后,在回傳給客戶端.這個程序代理服務器代理的是真實服務器端,客戶端對代理無感知,不知道請求的真實服務器的IP地址.

在不用反向代理的時候, 我們請求的是真實服務器,可以知道真實服務器的ip; 反向代理之后,請求的是代理服務器,代理服務器訪問真實服務器,從而隱藏了真實服務器,而暴露的是代理服務器,代理服務器需要配置真實服務器

高并發必備,5種負載均衡的方法,全了解月薪得2萬+以上了吧

3.1反向代理和正向代理的區別

  1. 正向代理,需要客戶端配置代理服務器;反向代理,則需要在代理服務器配置真實服務器

  2. 正向代理是代理服務器代理客戶端發送請求;反向代理是代理服務器端接受請求

  3. 因為正向代理 是代理客戶端發送請求,所以對于服務端,客戶端是隱藏的;

    反向代理是代理服務端接受請求,所以對于客戶端,服務端是隱藏的

在完整的請求和回應的互動中,客戶端的請求通過代理服務器,代理服務轉發客戶端請求到真實服務端,即正向代理;

服務端回應請求到代理服務器,代理服務器發送回應資料到客戶端,即反向代理

img

4.負載均衡

4.1 負載均衡理解

  1. 負載均衡(Load Balance) , 其含義就是指將負載(作業任務)進行平衡、分攤到多個操作單元上進行運行,,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成作業任務,

  2. 負載均衡的核心是:將負載進行平衡,

4.2 nginx的負載均衡

通過增加服務器的數量,將請求分發到各個服務器上,將原先的請求集中到單個服務器上的情況改為 將請求分發到多個服務器上,將負載分發到不同的服務器,也就是我們所說的負載均衡

Nginx服務器的負載均衡策略可以劃分為兩大類:即內置策略和擴展策略,內置策略主要包含輪詢、加權輪詢和IP hash三種;擴展策略主要通過第三方模塊實作,種類比較豐富,常見的有url hash、fair等,

在傳統的客戶端和服務端的互動中, 客戶端直接請求服務端,但是隨著業務量越來越大,單一架構下服務器需要處理的也越來越多. 服務器的并發能力是有限的,例如tomcat的默認并發能力是150,當然是可以配置的.實際運用中,最大并發數與硬體性能和CPU數量都有很大關系的,更好的硬體,更多的處理器都會使Tomcat支持更多的并發,

針對以上情況的解決方案:

(1) 服務器進行硬體升級:采用高性能服務器替換現有低性能服務器, 該方案的弊端:

高成本:高性能服務器價格昂貴,需要高額成本投入,而原有低性能服務器被閑置,造成資 源浪費,

可擴展性差:每一次業務量的提升,都將導致再一次硬體升級的高額成本投入,性能再卓越 的設備也無法滿足當前業務量的發展趨勢,
(2) 組建服務器集群,利用負載均衡技術在服務器集群間進行業務均衡,

該方案的優勢: 低成本

可擴展性:當業務量增長時,系統可通過增加服務器來滿足需求,且不影響已有業務,不降低服務質量

高可靠性:單臺服務器故障時,由負載均衡設備將后續業務轉向其他服務器,不影響后續業 務提供,保證業務不中斷,

點擊查看圖片來源

5.動靜分離

動靜分離是指在web服務器架構中,將靜態頁面與動態頁面或者靜態內容介面和動態內容介面,分開在不同系統(服務器)訪問的架構設計方法,進而提升整個服務訪問性能和可維護性,

img

二、Nginx 的安裝(Linux)

2.1 下載

nginx: 下載 (p2hp.com)

下載后上傳,或者直接用 wget命令

2.2 安裝

1、下載源代碼包

[root@web03 ~]# wget https://nginx.org/download/nginx-1.20.1.tar.gz

2、解壓

[root@web03 ~]# tar -xf nginx-1.20.1.tar.gz 

3、進入nginx目錄并且設定系統配置引數

[root@web03 ~]#cd nginx-1.20.1
[root@web03 nginx-1.20.1]# ./configure --help

image-20220630160557751

[root@web03 nginx-1.20.1]# ./configure --with-http_ssl_module --with-http_v2_module --with-stream	

--with-http_ssl_module # 配置HTTPS時使用
--with-http_v2_module # 配置GOLANG語言時使用
--with-stream # 啟用TCP/UDP代理服務

4.安裝相關依賴

[root@web03 nginx-1.20.1]# yum install pcre pcre-devel -y

image-20220630160650843

[root@web03 nginx-1.20.1]# yum install openssl openssl-devel -y

image-20220630160706306

5.設定系統配置引數

./configure --with-http_ssl_module --with-http_v2_module --with-stream

img

6、開始編譯

[root@web03 nginx-1.20.1]# make 

7、安裝

[root@web03 nginx-1.20.1]# make install 

image-20220630161011820

8、 加入環境變數

現在在命令列輸入nginx,報錯

image-20220630161057441

需要加入環境變數:

[root@web03 nginx]# vi /etc/profile 

img

新增以下內容:

export PATH=$PATH:/usr/local/nginx/sbin			

使檔案生效:

[root@web03 nginx]# source /etc/profile

現在在命令列輸入nginx就行了

img

9、加入system系統管理(重要:一定要頂格寫)

[root@web03 sbin]# vi /usr/lib/systemd/system/nginx.service

image-20220630161148111

輸入以下內容:

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target
				

10、多載system服務并啟動

[root@web03 sbin]# systemctl daemon-reload
[root@web03 sbin]# systemctl start nginx

常見錯誤:

1、./configure: error: the HTTP rewrite module requires the PCRE library.

# 安裝相關包
yum install pcre pcre-devel -y				

2、./configure: error: SSL modules require the OpenSSL library.

# 安裝相關包
yum install openssl openssl-devel -y 

image-20220630161524506

2.3 防火墻問題

在 windows 系統中訪問 linux 中 nginx,默認不能訪問的,因為防火墻問題 (1)關閉防火墻 (2)開放訪問的埠號,80 埠

查看開放的埠號

firewall-cmd --list-all 
設定開放的埠號

設定開放的埠號

firewall-cmd --add-service=http –permanent 
firewall-cmd --add-port=80/tcp --permanent 

重啟防火墻

firewall-cmd –reload 

如果是購買的云服務器,還需要配置網路安全組

三、nginx常用命令及組態檔

3.1操作命令

使用nginx操作命令的前提是必須再nginx 的目錄下

[root@VM-24-7-centos /]# cd  /usr/local/nginx/sbin

1.查看 nginx 的版本號

[root@VM-24-7-centos sbin]# ./nginx -v
nginx version: nginx/1.20.2

2.查看 nginx 啟動狀態

[root@VM-24-7-centos sbin]# ps -ef | grep nginx
nobody    7508 10737  0 4月30 ?       00:00:24 nginx: worker process
root     10737     1  0 4月30 ?       00:00:00 nginx: master process ./nginx
root     15912  8298  0 16:21 pts/0    00:00:00 grep --color=auto nginx

2.nginx 啟動

[root@VM-24-7-centos sbin]# ./nginx

3.關閉 nginx

[root@VM-24-7-centos sbin]# ./nginx -s stop

4.重新加載 nginx,改完組態檔,重新加載組態檔

[root@VM-24-7-centos sbin]# ./nginx -s reload

3.2組態檔

nginx 安裝目錄下,其默認的組態檔都放在這個目錄的 conf 目錄下,而主組態檔
nginx.conf 也在其中,后續對 nginx 的使用基本上都是對此組態檔進行相應的修改

image-20220630165740709

(1)nginx組態檔

http {
    include       mime.types;    # nginx支持的媒體檔案型別,相對路徑為同目錄conf下的其他檔案
    default_type  application/octet-stream;      # 默認的媒體型別

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   # 訪問日志的格式
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;   # 啟用sendfile傳輸模式,此模式是"零拷貝"
    #tcp_nopush     on;   # 只在sendfile on時有效,讓資料包擠滿到一定程度才發送出去,擠滿之前被阻塞

    #keepalive_timeout  0;   # keepalive的超時時間
    keepalive_timeout  65;

    #gzip  on;               # 是否啟用gzip壓縮回應報文

    server {                    # 定義虛擬主機
        listen       80;        # 定義監聽套接字
        server_name  localhost; # 定義主機名加域名,即網站地址

        #charset koi8-r;        # 默認字符集

        #access_log  logs/host.access.log  main;         # 訪問日志路徑

        location / {                        # location容器,即URI的根
            root   html;                    # 站點根目錄,即DocumentRoot,相對路徑時為<prefix>/html
            index  index.html index.htm;    # 站點主頁檔案
        }

        #error_page  404    /404.html;      # 出現404 page not fount錯誤時,使用/404.html頁回應客戶端

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;      # 出現50x錯誤時,使用/50x.html頁回傳給客戶端
        location = /50x.html {                        # 定義手動輸入包含/50x.html時的location
            root   html;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

第一部分:全域塊

worker_processes  1;#nginx行程,一般設定為和cpu核數一樣

從組態檔開始到 events 塊之間的內容,主要會設定一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,行程 PID 存放路徑、日志存放路徑和型別以及組態檔的引入等,

比如上面第一行配置的:這是 Nginx 服務器并發處理服務的關鍵配置,worker_processes 值越大,可以支持的并發處理量也越多,但是會受到硬體、軟體等設備的制約

第二部分:events 塊

events {
    worker_connections  1024;
}

比如上面的配置:

上述例子就表示每個 work process 支持的最大連接數為 1024.這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置,

events 塊涉及的指令主要影響 Nginx 服務器與用戶的網路連接,常用的設定包括是否開啟對多 work process 下的網路連接進行序列化,是否允許同時接收多個網路連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等,

第三部分:http 塊

http {
    include       mime.types;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location = /50x.html {
            root   html;
        }
    }
}

這算是 Nginx 服務器配置中最頻繁的部分,代理、快取和日志定義等絕大多數功能和第三方模塊的配置都在這里,

需要注意的是:http 塊也可以包括 http 全域塊server 塊

①http 全域塊

http 全域塊配置的指令包括檔案引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等,

②server 塊

這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬體主機是完全一樣的,該技術的產生是為了節省互聯網服務器硬體成本,

每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機,

而每個 server 塊也分為全域 server 塊,以及可以同時包含多個 locaton 塊,

1、全域 server 塊

最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置,

2、location 塊

一個 server 塊可以配置多個 location 塊,

這塊的主要作用是基于 Nginx 服務器接收到的請求字串(例如 server_name/uri-string),對虛擬主機名稱

(也可以是 IP 別名)之外的字串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理,地址定向、資料緩

存和應答控制等功能,還有許多第三方模塊的配置也在這里進行,

四、nginx配置 反向代理和負載均衡

應用nginx配置

  1. /nginx -s reload

  2. ./nginx -s stop ./nginx

1.反向代理

1.1實作一

通過nginx配置后,通過80埠訪問nginx ,nginx 轉發到tomcat的8080埠

image-20220701010345081

在 nginx.conf組態檔中,加入如下配置

proxy_pass: URL; 該指令就是同來設定 真實服務器的地址,可以是主機名稱,也可以是IP地址加埠號

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  1999.life;
        location / {
        	proxy_pass http://127.0.0.1:8080;
            root   html;
            index  index.html index.htm;
        }
        location = /50x.html {
            root   html;
        }
    }
}

上述配置,就是當我們訪問域名1999.life的80埠時,由于nginx監聽了80埠, 會轉發到http://127.0.0.1:8080根目錄

1.1實作二

實作效果:使用 nginx 反向代理,根據訪問的路徑跳轉到不同埠的服務中 nginx 監聽埠為 9001,

訪問 http://127.0.0.1:9001/edu/ 直接跳轉到 127.0.0.1:8081

訪問 http://127.0.0.1:9001/vod/ 直接跳轉到 127.0.0.1:8082

第一步,準備兩個 tomcat,一個 8001 埠,一個 8002 埠,并準備好測驗的頁面 第二步,修改 nginx 的組態檔 在 http 塊中添加 server{}

    server {
        listen       8800;
        #listen       101.43.181.85;
        server_name  101.43.181.85;

        location ~ /vod/ {
            proxy_pass http://127.0.0.1:8081;
            root   html;
            index  index.html index.htm;
        }
        location ~ /edu/ {
            proxy_pass http://127.0.0.1:8080;
            root   html;
            index  index.html index.htm;
        }

    }

上述配置 是nginx監聽 8800埠, 當請求路徑包含 vod 時 ,代理8081埠;包含edu時,代理8080埠,~ 表示后面是正則運算式的形式

2.負載均衡

2.1 輪詢演算法(默認)

每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除

我在兩個tomcat 中配置了 , 相同的路徑和資源.

upstream myserver{
server 101.43.181.85:8080;
server 101.43.181.85:8081;
}

    server {
        listen       8801;
        server_name  101.43.181.85;
        location / {
            proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }
    }

image-20220701114943035

上述配置, 監聽了8801 埠, 組態檔中 upstream myserver 配置在 http全域塊中,在location 中配置proxy_pass,并指向 upstream myserver.

myserve 是定義組名.location中將請求轉發到 組名為myserve 的組

2.2 加權輪詢(權重)演算法(weight)

upstream myserver{
server 101.43.181.85:8080 weight=5;
server 101.43.181.85:8081 weight=10;
}

    server {
        listen       8801;
        server_name  101.43.181.85;
        location / {
            proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }
    }

上述配置中, 和默認輪詢的寫法不同的就是 , 在組中,url后面多了 weight, 配置了權重.

當為服務器指定權重引數時, 權重將作為負載均衡決策的一部分,

image-20220701115458453

2.3 ip_hash

2.3.1 ip_hash介紹

  • ip_hash是根據用戶請求過來的ip,然后映射成hash值,然后分配到一個特定的服務器里面;
  • 使用ip_hash這種負載均衡以后,可以保證用戶的每一次會話都只會發送到同一臺特定的Tomcat里面,它的session不會跨到其他的tomcat里面去的;

在這里插入圖片描述

  • 首先通過將ip地址映射成一個hash值,然后將hash值對Tomcat的數量3取模,得到Tomcat的索引0、1、2;

  • 比如:5%3=2,則把這個請求發送到Tomcat3服務器,以此類推;

  • 這樣一來,只要用戶的IP不發生改變,當前用戶的會話就能夠一直保持;

    在這里插入圖片描述

nginx的ip_hash演算法是取ip地址的前三段數字進行hash映射,如果只有最后一段不一樣,也會發送到同一個Tomcat里面

2.3.2 ip_hash 配置

    upstream myserver{
        ip_hash;
        server 101.43.181.85:8080 weight=5;
        server 101.43.181.85:8081 weight=10;
    }

    server {
        listen       8801;
        server_name  101.43.181.85;
        location / {
            proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }
    }

在nginx里面使用ip_hash,直接添加ip_hash關鍵字即可,后續同一ip的訪問將只會請求同一個服務器,

2.3.3 注意事項

  • 一旦使用了ip_hash,當我們需要移除一臺服務器的時候,不能直接洗掉這個配置項,而是需要在這臺服務器配置后面加上關鍵字down,表示不可用;

  • upstream myserver { 
    	ip_hash; 
    	server 192.168.11.73:8080; 
    	server 192.168.11.74:8080 down; 
    	server 192.168.11.75:8080; 
    }
    
  • 因為如果直接移除配置項,會導致hash演算法發生更改,后續所有的請求都會發生混亂;

2.4 least_conn

按節點連接數分配,把請求優先分配給連接數少的節點,該策略主要為了解決,各個節點請求處理時間長短不一造成某些節點超負荷的情況,

按照nginx檔案的說法,請求將被傳遞給當前擁有最少活躍連接的server,同時考慮權重weight的因素,

upstream myserver{
    least_conn;
    server 192.168.9.134:8081;
    server 192.168.9.134:8082;
}

在nginx里面使用least_conn,直接添加least_conn關鍵字即可,

2.5 fair(第三方)

按后端服務器的回應時間來分配請求,回應時間短的將會被優先分配

需要安裝 nginx-upstream-fair-master 第三方模塊
下載地址:https://github.com/gnosek/nginx-upstream-fair

重新檢測nginx編譯環境
編譯時需要指定添加模塊的絕對路徑

 [root@localhost nginx-1.18.0]# ./configure --with-http_ssl_module --add-module=/root/nginx-upstream-fair-master

若出現以下報錯

error: ‘ngx_http_upstream_srv_conf_t’ has no member named ‘default_port’

解決方法
修改NGINX下的ngx_http_upstream.h檔案

[root@localhost ~]# vim nginx-1.18.0/src/http/ngx_http_upstream.h

在ngx_http_upstream_srv_conf_s結構添加一行 in_port_t default_port

image-20220701151232093

然后重新編譯安裝就可以了

修改NGINX的組態檔,指定演算法為fair演算法

upstream myserver{     
    server 192.168.9.134:8081;
    server 192.168.9.134:8082;
    fail;
}

五、nginx 動靜分離

1.基本介紹

  • 動靜分離指的是將動態請求和靜態請求分隔開,然后分別路由到相應的后端服務器,
  • 通常用戶的請求中,一部分需要后臺程式處理,例如查詢資料庫或者進行一些資料運算,這類請求我們稱之為動態請求
  • 還有一部分不需要后臺程式處理,如請求 css、html、js、圖片等靜態資源,這類請求我們稱之為靜態請求
  • Nginx 實作動靜分離的基礎是它可以根據配置對不同的請求做不同的轉發,動靜分離有利于提高整個服務器系統的性能,

image-20220701153926482

Nginx 動靜分離簡單來說就是把動態跟靜態請求分開,不能理解成只是單純的把動態頁面和靜態頁面物理分離,嚴格意義上說應該是動態請求跟靜態請求分開,可以理解成使用 Nginx 處理靜態頁面,Tomcat 處理動態頁面,動靜分離從目前實作角度來講大致分為兩種,

一種是純粹把靜態檔案獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;

另外一種方法就是動態跟靜態檔案混合在一起發布,通過 nginx 來分開,通過 location 指定不同的后綴名實作不同的請求轉發,通過 expires 引數設定,可以使瀏覽器快取過期時間,減少與服務器之前的請求和流量,具體 Expires 定義:是給一個資源設定一個過期時間,也就是說無需去服務端驗證,直接通過瀏覽器自身確認是否過期即可,所以不會產生額外的流量,此種方法非常適合不經常變動的資源,(如果經常更新的檔案,不建議使用 Expires 來快取),我這里設定 3d,表示在這 3 天之內訪問這個 URL,發送一個請求,比對服務器該檔案最后更新時間沒有變化,則不會從服務器抓取,回傳狀態碼304,如果有修改,則直接從服務器重新下載,回傳狀態碼 200,點擊查看圖片來源

2.配置

image-20220701160313428

我準備了兩個靜態資源

/data/test/www/a.html

/data/test/image/001.jpg

    server {
        listen       8802;
        server_name  101.43.181.85;
        location /www/ {
            root   /data/test/;
            index  index.html index.htm;
        }
        location /image/ {
        root /data/test/;
        autoindex on;
        }
    }

上述配置location 部分, 當我們路徑為www時, 會匹配到 對應的location,到/data/test/www 路徑下,尋找對應資源;

當我們路徑為image時, 匹配到對應的location,到/data/test/image路徑下,尋找對應資源

image-20220701160845870

image-20220701160909326

autoindex on 的作用是列出 檔案夾下的內容

image-20220701161344664

六、nginx高可用

1.什么是高可用?

高可用(High availability,縮寫為 HA),是指系統無中斷的執行其功能的能力,代表系統的可用性程度,高可用的主要目的就是為了保障“業務的連續性”,即在用戶的眼里,業務永遠都是正常對外提供服務的,它通常是指,通過設計減少系統不能提供服務的時間,

假設系統一直能夠提供服務,我們說系統的可用性是100%,如果系統每運行100個時間單位,會有1個時間單位無法提供服務,我們說系統的可用性是99%,很多公司的高可用目標是4個9,也就是99.99%,這就意味著,系統的年停機時間為8.76個小時,

常見的互聯網分層架構

img

常見互聯網分布式架構如上,分為:

(1)客戶端層:典型呼叫方是瀏覽器browser或者手機應用APP

(2)反向代理層:系統入口,反向代理

(3)站點應用層:實作核心應用邏輯,回傳html或者json

(4)服務層:如果實作了服務化,就有這一層

(5)資料-快取層:快取加速訪問存盤

(6)資料-資料庫層:資料庫固化資料存盤

整個系統的高可用,又是通過每一層的冗余+自動故障轉移來綜合實作的,

2.nginx 高可用

nginx作為負載均衡器,所有請求都到了nginx,可見nginx處于非常重點的位置,如果nginx服務器宕機后端web服務將無法提供服務,影響嚴重,

為了屏蔽負載均衡服務器的宕機,需要建立一個備份機,主服務器和備份機上都運行高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的運行狀況,當備份機不能在一定的時間內收到這樣的資訊時,它就接管主服務器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務,

2.1keepalived+nginx實作主備

2.1.1 什么是keepalived

keepalived 是集群管理中保證集群高可用的一個服務軟體,用來防止單點故障,

Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或作業出現故障,Keepalived將檢測到,并將有故障的web服務器從系統中剔除,當web服務器作業正常后Keepalived自動將web服務器加入到服務器群中,這些作業全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器,

2.1.2 keepalived作業原理

keepalived是以VRRP協議為實作基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議,

虛擬路由冗余協議,可以認為是實作路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(VIP = Virtual IP Address,虛擬IP地址,該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,這樣的話就可以保證路由器的高可用了,

keepalived主要有三個模塊,分別是core、check和VRRP,core模塊為keepalived的核心,負責主行程的啟動、維護以及全域組態檔的加載和決議,check負責健康檢查,包括常見的各種檢查方式,VRRP模塊是來實作VRRP協議的,

2.1.3 keepalived+nginx實作主備程序

初始狀態Nginx負載均衡高可用指的是什么意思

主機宕機Nginx負載均衡高可用指的是什么意思

主機恢復

Nginx負載均衡高可用指的是什么意思

基礎環境準備

(1)安裝Nginx:
# 添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安裝Nginx
sudo yum install -y nginx

# 啟動Nginx
sudo systemctl start nginx.service

# 瀏覽器訪問測驗
http://192.168.253.11/
http://192.168.253.12/
(2)安裝KeepAlived可使用yum直接安裝:
yum -y install keepalived

查看KeepAlived組態檔:

cat /etc/keepalived/keepalived.conf

接下來就是要對該組態檔進行修改,該組態檔在/etc/keepalived/路徑下,在默認的keepalive.conf里面還有 virtual_server,real_server 這樣的配置,它是為lvs準備的,

(3)關閉防火墻(默認關閉)
(4)關閉selinux(如果不關閉,KeepAlived不生效)

臨時關閉

[root@localhost ~]# getenforce Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive

永久關閉:

[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改為 SELINUX=disabled
重啟服務reboot

配置主備模式

(1) 修改主組態檔:

! Configuration File for keepalived

global_defs {
     notification_email {
          [email protected]
          [email protected]
          [email protected]
     }
     
     notification_email_from [email protected]
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id master11
}

# nginx掛了,實作vip自動漂移,使用如下腳本控制     
vrrp_script check_nginx {
      script "/usr/local/nginx/nginx_check.sh"
      interval 2  # 機器宕機執行的次數
      weight 2
}

# 當前實體配置
vrrp_instance VI_1 {
     state MASTER   # 主機
     interface ens33  # 系結的網卡
     virtual_router_id 51   # 組id,需要一致
     priority 100  # 優先級
     advert_int 1  # 檢查間隔,默認1s
     
     # 呼叫nginx掛了之后進行vip漂移的函式  
     track_script {
       	check_nginx
     }
     
     authentication {
       	auth_type PASS
       	auth_pass 1111
     }
     
     # 配置vip
     virtual_ipaddress {
        192.168.253.50/24 dev ens33 label ens33:1 scope global
 	 }
}

在默認的keepalive.conf里面還有 virtual_server,real_server 這樣的配置,我們這用不到,它是為lvs準備的,

(2) 腳本檔案

/usr/local/nginx/nginx_check.sh :

# 在/usr/local下新建目錄nginx
mkdir nginx
# 新建檔案
touch nginx_check.sh
# 編輯內容
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`   #查看nginx行程是否存在  
#if [ $A -eq 0 ];then              
  /usr/sbin/nginx         #重啟nginx
  if [ $A -eq 0 ];then   #nginx重啟失敗
    exit 1 # keepalived執行腳本,回傳非0結果,ip漂移
  else
    exit 0 # keepalived執行腳本,回傳0,ip不漂移
  fi
#else
#  exit 0
#fi

需要給nginx_check.sh檔案加可執行權限

chmod +x nginx_check.sh

(3)修改從機keepalived.conf組態檔

! Configuration File for keepalived
global_defs {
     notification_email {
          [email protected]
          [email protected]
          [email protected]
     }
    
     notification_email_from [email protected]
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id backup
}

vrrp_script check_nginx {
     script "/usr/local/nginx/nginx_check.sh"
     interval 2
     weight 2
}

vrrp_instance VI_1 {
     state BACKUP  # 從機
     interface ens33
     virtual_router_id 51  # 組id,需要一致
     priority 99   # 優先級
     advert_int 1
        
     # 呼叫nginx掛了之后進行vip漂移的函式    
     track_script {
       	check_nginx
     }
     
     authentication {
       	auth_type PASS
       	auth_pass 1111
     }
    
     # 配置vip
     virtual_ipaddress {
        192.168.253.50/24 dev eth0 label ens33:1 scope global
     }
}

同樣需要在/usr/local/nginx/路徑下放上nginx_check.sh腳本檔案,

(4) 啟動nginx、keepalived

#主從啟動
sudo systemctl restart nginx.service
#主從啟動
systemctl start keepalived

(5) 訪問測驗

為效果明顯,可以修改Nginx首頁,將主從IP地址放置首頁以便區分,

訪問http://192.168.253.50 or curl 192.168.253.50

查看Nginx日志

cd  /var/log/nginx/
cat  access.log

查看主服務器keepalived日志:

Keepalived默認所有的日志都是寫入到/var/log/message ,
你可以使用命令 tail -f /var/log/messages|grep Keepalived 進行查看

查看ens33網卡資訊:

ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UNKNOWN group default qlen 1000
 inet 192.168.253.11/24 brd 192.168.253.255 scope
global noprefixroute ens33 
 inet 192.168.253.50/24 scope global secondary ens33:1
#VIP已漂移到主機,vip只能選擇一個機器進行系結

(6)停掉主服務器的nginx

通過瀏覽器訪問:http://192.168.253.50
查看主機KeepAlived日志:

tail -f /var/log/messages|grep Keepalived
# 強制停止
pkill -9 nginx

# 查看Nginx行程
ps -ef | grep nginx

# 等待幾秒后再次查看Nginx行程,發現已經通過檢查腳本自啟
# 因為在keepalived腳本中,進行了nginx重啟操作

則會執行腳本nginx_check.sh進行nginx啟動!

如果master上的nginx服務掛了,則nginx會自動重啟,重啟失敗后會自動關閉keepalived,這樣vip資源也會轉移到slave上,
master和slave兩邊都開啟nginx服務,無論master還是slave,當其中的一個keepalived服務停止后,vip都會漂移到keepalived服務還在的節點上;
如果要想使nginx服務掛了,vip也漂移到另一個節點,則必須用腳本或者在組態檔里面用shell命令來控制,(nginx服務宕停后會自動啟動,啟動失敗后會會致使vip資源漂移到另一臺機器上)

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/498492.html

標籤:Java

上一篇:Optional類詳解

下一篇:Java 值傳遞與參考傳遞的簡介說明

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more