Java進階——帶你入門分佈式中的Nginx

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

經過 Nginx 提供的反向代理和負載均衡功能,能夠合理的完成業務的分配,提升網站的處理能力;同時利用緩存功能,還能夠將不須要實時更新的動態頁面輸出結果,轉化爲靜態網頁造成緩存,從而提升網站的響應速度。git

代理和反向代理

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

位於客戶端和目標服務器之間,起到一箇中轉的做用。其實就是客戶端想訪問目標服務器,可是由於某些緣由不可以直接訪問,則把請求和目標服務器發給代理服務器,代理服務器再去請求目標服務器,把返回的響應結果返回給客戶端。github

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

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

 

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 架構以下圖:bash

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.zipmv 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;}

若是有什麼錯誤的地方,但願你們能指出,一塊兒學習進步。

動動小手點點關注吧!

Java架構師學習公衆號!

一個專一分享架構乾貨的微信公衆號

以爲本文有用就把文章分享給更多的人看到吧!

相關文章
相關標籤/搜索