More  

收藏本站

電腦請使用 Ctrl + D 加入最愛
手機請使用 收藏
關閉

小編的世界 優質文選 主機

Nginx專題之-搭建具備緩存的反向代理服務器(基於雲服務器)


字體大小:
2020年10月23日 -
:     
 

大腚哥技術控

昨天我們介紹了Nginx作為靜態代理資源的web服務器

Nginx專題之-搭建可用靜態資源web服務器(基於雲服務器)

,我以這個為例子,我們再准備一台上遊服務器(可以是tomcat、Apache等)。昨天咱們搭建的Nginx服務器作為反向代理服務器使用。為什麼這麼做呢,因為上遊服務器需要處理複雜多變的業務邏輯,所以上遊服務器的效能很一般,我們使用nginx作為反向代理後,可以由一台nginx請求按照負載均衡的算法代理給多台上遊服務器。這樣我們就可以在用戶無感知的情況下,增加上遊的業務服務器,做到水平擴展。當上流服務器出現了問題,Nginx可以自動的把有問題的上遊服務器的請求轉交給正常的服務器。

01

搭建一個具備緩存功能的反向代理服務器

nginx對proxy的設置文檔

Nginx的http_proxy模塊,使用proxy_cache_path進行配置緩存功能。Nginx對訪問過的內容會在Nginx服務器本地創建一個副本,在預設的時間段內再次訪問該數據的內容,就不需要通過Nginx服務器反向代理向上遊服務器發出請求,這樣能夠減少Nginx對上遊服務器的請求,而減少網絡流量,同時也減小了數據傳輸的延遲,提高了數據訪問的速度。同時當後端服務器出現問題,Nginx服務器上的副本資源還能夠將數據返回給客戶端的請求,這樣提高了服務器的可用性。但是緩存只針對一些不經常變化的資源(如:css,js,圖片等)

nginx配置示例

首先准備好一台上遊服務器
(可以是tomcat,Apache等)

添加上遊的服務器到Nginx中

在http塊中添加upstream:upstream local {server 上遊服務地址+端口 ; }可以添加多個上遊服務器。

在server->location塊中添加緩存的參數:

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarede_for;

proxy_pass http://local; #local是咱們定義upstream的名稱

http塊添加緩存

proxy_cache_path /tmp/nginxcacge levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

#proxy_cache_path 本地路徑,用來設置Nginx緩存資源的存放地址

#levels 默認所有緩存文件都放在同一個cache下,但是會影響緩存性能。所以會建立子目錄存放不同的文件。

#keys_zone 在共享內存中設置一塊存儲區域來緩存的key和metadate,nginx可以判斷一個請求是否命中緩存。1m大概可以存儲8000個key;10m可以存儲80000個key。

#max_size 最大緩存空間,如果不指定,會使用掉所有的磁盤空間。當達到配額後,會刪除最少使用的緩存文件。

#inactive 未被訪問在緩存中的保留時間,如果沒有使用將被刪除(默認是10分鐘)。

#use_temp_path 如果為off,nginx會將緩存文件直接寫指定的緩存文件中,而不適用temp_path存儲。建議為off,避免文件在不同目錄下不必要的複制。

在location開啟緩存功能

proxy_cache my_cache; #my_cache 是我們上面定義的

proxy_cache_key $host$uri$is_args$args; #同一個url對不同用戶展示的不一樣的(用戶變量放到key中,參數指明了哪個用戶等)

proxy_cache_valid 200 304 302 1d; #對響應碼是200、304、302的資源,設置緩存時長1天。

02

Nginx緩存的一些其他的說明

proxy_cache_use_stale增強容錯能力

上遊服務器出現問題,nginx可以使用緩存內容來響應客戶端的請求。

多磁盤分割存儲緩存

使用Nginx,如果有多個硬盤,可以用來在多個硬盤之間分割緩存

/path/hd1 keys_zone=my_cache1

/path/hd2 keys_zone=my_cache2

split_clients $request_uri $my_cache{50% "my_cache1";50% "my_cache2";}

location / {proxy_cache $my_cache;}

聲明:如有錯誤,請讀者留言糾正。謝謝您提出的寶貴意見,我會及時修改。