代理與反向代理、負載均衡和快取

FixBug發表於2019-04-02

如何實現伺服器之間的協同功能呢?

通過Nginx提供的反向代理負載均衡功能,可以合理的完成業務的分配,提高網站的處理能力;同時利用快取功能,還可以將不需要實時更新的動態頁面輸出結果,轉化為靜態網頁形成快取,從而提高網站的響應速度。

代理和反向代理

代理(正向代理,目標伺服器不知道誰在訪問)

位於客戶端和目標伺服器之間,起到一箇中轉的作用。其實就是客戶端想訪問目標伺服器,但是因為某些原因不能夠直接訪問,則把請求和目標伺服器發給代理伺服器,代理伺服器再去請求目標伺服器,把返回的響應結果返回給客戶端。

反向代理(使用者實際並不知道最終伺服器,只是訪問一個反向代理伺服器而已)

客戶端會把反向代理伺服器當成目標伺服器,向反向代理伺服器傳送請求後,反向代理伺服器再請求內部的後端伺服器,把得到的響應結果返回給客戶端。

image.png

特性:

  • 安全性。反向代理具有安全性。能隱藏真實的內部伺服器。
  • 功能性。正向代理主要用途是為防火牆內的區域網使用者提供訪問外網的途徑。反向代理主要用途是將防火牆內的伺服器提供給外邊的使用者訪問,同時也可以為多個後端伺服器提供負載均衡功能、快取功能等。

反向代理服務配置

在Nginx配置檔案中的location塊中,這是 proxy_pass ` 指令。

server{
listen 80;
  server_name test.test;
  #將本機接收到的test.test的請求全部轉發到另外一臺伺服器192.168.78.128
  location /{
    proxy_pass http://192.168.78.128; 
    #下面是其他輔助指令
    proxy_set_header Host $host; #更改來自客戶端的請求頭資訊
    proxy_set_header X-Real_IP $remote_addr;    #使用者真實訪問ip
    proxy_connect_timeout 2; #配置nginx與後端伺服器建立連線的超時時間
    proxy_read_timeout 2; #配置nginx向後端發出read請求的等待響應超時時間
    proxy_send_timeout 2; #配置nginx向後端伺服器發出write請求的等待響應超時時間
    proxy_redirect http://www.baidu.com; #用於修改後端伺服器返回的響應頭中的Location和Refresh
  }
}

負載均衡

負載均衡(load balance):就是將負載分攤到多個操作單元上執行,從而提高服務的可用性和響應速度。

  1. 一個沒有負載均衡的web架構如下圖:

image.png
使用者直接連線伺服器,這個時候如果這臺伺服器掛了,那麼就整個網站掛了。

  1. 有負載均衡的web架構

image.png
使用者不直接訪問後端伺服器,而是訪問負載均衡伺服器,由負載均衡伺服器再次轉發到後端伺服器。如果這個時候有一臺後端伺服器掛掉了,那麼負載均衡伺服器會剔除掉它,將後續請求都轉發到好的那臺,這樣就不影響網站的正常執行。這個時候我們也需要考慮負載均衡伺服器會不會掛掉,那就引入第二個負載均衡伺服器來緩解一下。

image.png

負載均衡的配置

通過配置負載均衡伺服器的Nginx中的upstream指令可以實現。

不同負載均衡配置的特點如下圖所示:

配置方式 說明
輪詢方式(預設) 每個請求按照時間順序逐一分配到不同的後端伺服器,如果有伺服器當機,會自動剔除。
權重方式(weight) 利用weight制定輪詢的權重比率,與訪問率成正比,用於後端伺服器效能不均的情況,效能好的伺服器weight高一點。
ip_hash 使每個訪客固定訪問一個後端伺服器,這樣可以解決session共享的問題。
第三方模組(fair、url_hash)nginx預設不包含第三方模組,使用時需要安裝 第三方模組採用fair,按照每臺伺服器的響應時間來分配,響應時間短的優先分配。如果第三方模組採用的是url_hash,則安裝url的hash值來分配。

一般輪詢配置

server{
    listen 80;
  server_name test.test;
  location / {
    proxy_pass http://web_server; #反向代理
  }
}
#配置負載均衡伺服器組
upstream web_server {
    server 192.168.78.128;
  server 192.168.78.129;
}

加權輪詢配置

#配置負載均衡伺服器組
upstream web_server {
    server 192.168.78.128 weight=1;
  server 192.168.78.129 weight=3;
}

這裡面的權值總和為一個迴圈,這裡以4次為一個迴圈,那麼就是每四次請求中,三次會被分派到129這個伺服器,一次分配到128,但是具體三次並不會順序執行,而是按照演算法分散執行。
我們也可以設定每臺web伺服器在負載均衡排程中的狀態。

upstream web_server{
    server 192.168.78.128 weight=1 max_fails=1 fail_timeout=2; #允許請求失敗次數,在請求max_fail次數失敗後,暫停服務的時間
  server 192.168.78.200 backup; #預留的備份伺服器
  server 192.168.78.33 down; #當前伺服器不參與負載均衡
}

ip_hash 配置

upstream web_server{
    ip_hash;
  server 192.168.78.120;
  server 192.168.78.123;
  server 192.168.78.33 down; #如果這臺伺服器當機,則用down表示當前伺服器暫不參與負載均衡
}

使用ip_hash的時候,不能使用weight和backup。

第三方模組(fair)

  1. 備份已安裝的Nginx

由於使用第三方模組,需要重新編譯Nginx,所以需要關閉已經開啟的Nginx程式,對已經安裝好的Nginx進行備份,便於恢復。

cp -r /usr/local/nginx /usr/local/nginx_old
  1. 重新編譯安裝Nginx

先從github獲取fair模組,下載到zip到root目錄下,解壓。

unzip nginx-upstream-fair-master.zip #解壓
mv nginx-upstream-fair-master nginx-upstream-fair #重新命名

如果沒有 unzip 命令,則需要用 yum install unzip 安裝。

cd  nginx-1.10.1
#配置
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=/root/nginx-upstream-fair
#編譯安裝
make && make install
  1. 配置fair的負載均衡

開啟新安裝的Nginx配置檔案,在 http 塊下實現fair的負載均衡。

server{
    listen 80;
  server_name test.test;
  location / {
    proxy_pass http://web_server
  }
}

upstream web_server{
    server 192.168.78.128;
  server 192.168.78.132;
  fair;     #使用fair
}

快取配置

對於一些含有大量內容的網站來說,隨著訪問量的增多,對於經常被訪問的內容,如果每一次都從伺服器中獲取,則給伺服器很大的壓力。所以我們可以利用反向代理伺服器對訪問頻率較多的內容進行快取,有利於節省後端伺服器的資源。

原理

web快取伺服器位於內容源web伺服器和客戶端之間,當客戶端訪問一個url時,快取伺服器請求內容源伺服器,並將響應結果快取到記憶體或硬碟,當下一次請求同一個url時,快取伺服器直接將已快取的內容輸出給客戶端,這樣就減少了再次向內容源伺服器請求的次數。

image.png

永久快取配置(proxy_store)

Nginx提供了 proxy_store 指令用於快取內容伺服器響應到本地,若不手動刪除,則一直存在。

server{
    listen 80;
  server_name test.test;
  location / {
    root cache; #制定個快取檔案的儲存目錄
    proxy_store on; #開啟本地快取
    proxy_store_access user:rw group:rw all:r; #設定快取的讀寫規則
    proxy_temp_path cache_tmp; #設定反向代理時接收的資料臨時儲存檔案的目錄,該目錄會自動建立

    #利用正則匹配快取檔案、目錄或符號連結是否存在,如果不存在再執行塊語句
    if(!-e $request_filename){
        proxy_pass http://192.168.78.128; 
    }
  }
}

 

臨時快取(proxy_cache)

Nginx伺服器提供了 proxy_cache 指令設定臨時快取。採用md5演算法將請求連結進行hash後,根據具體配置生成快取檔案目錄,儲存響應資料。

在快取伺服器上配置 nginx.conf 中的 **http** 塊   

#代理臨時目錄
proxy_temp_path /usr/local/nginx/proxy_temp_dir; #設定快取伺服器接收內容伺服器響應內容使用的臨時目錄
#web快取目錄和引數設定
proxy_cache_path /usr/local/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50minactive=1m max_size=500m; #自定義儲存目錄,

 
配置 server 塊:

server {
    listen 80;
  server_name test.test;
  #增加兩個響應頭,用於獲取訪問的伺服器地址與快取是否成功
  add_header X-Via $server_addr;
  add_header X-Cache $upstream_cache_status;
  location /{
    proxy_cache cache_one; #設定快取區域名稱
    proxy_cache_key $host$uri$is_args$args; #以域名、uri、引數組合成web快取的key,nginx根據key值雜湊
    proxy_cache_valid 200 10m;  #對200狀態碼設定快取時間
    proxy_cache_valid 304 1m;
    proxy_cache_valid any 1m;   #其他未設定的快取1分鐘
    proxy_pass http://192.168.78.128;
  }
}

快取清理配置

因為Nginx不支援清理制定url的快取,需要藉助第三方模組來實現。例如ngx_cache_purge

  1. 備份已安裝的Nginx

在新增 ngx_cache_purge 模組之前,關閉Nginx服務,備份已有的Nginx服務。

cp -r /usr/local/nginx /usr/local/nginx_old2
  1. 重新編譯安裝Nginx

在github獲取 ngx_cache_purge zip包,並解壓安裝。

unzip ngx_cache_purge-master.zip
mv ngx_cache_purge-master /usr/local/ngx_cache_purge

#進入ngxin檔案的解壓目錄配置一下
cd nginx-1.10.1
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=/usr/local/ngx_cache_purge

#編譯和安裝
make && make install
  1. 配置快取清理功能

    使用 proxy_cache_purge 指令實現快取清理。

注意:

  • 指定的快取區名稱和proxy_cache_purge指令中出現的快取區名稱一致。
  • key值設定規則要一致。
  • 清理快取的location的編寫位置在所有location之前,防止其他正則location提前匹配。
location ~/purge(/.*){
    allow 192.168.78.1;
  deny all;
  proxy_cache_purge cache_one $host$uri$is_args$args;
}

如果有什麼錯誤的地方,希望大家能指出,一起學習進步。

相關文章