一、nginx快取的優點
如圖所示,nginx快取,可以在一定程度上,減少源伺服器的處理請求壓力。 因為靜態檔案(比如css,js, 圖片)中,很多都是不經常更新的。 nginx使用proxy_cache將使用者的請求快取到本地一個目錄。下一個相同請求可以直接調取快取檔案,就不用去請求伺服器了。 畢竟,IO密集型服務的處理是nginx的強項。
二、如何進行設定
先上個栗子:
http{
proxy_connect_timeout 10;
proxy_read_timeout 180;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 96k;
proxy_temp_file_write_size 96k;
proxy_temp_path /tmp/temp_dir;
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g;
server {
listen 80 default_server;
server_name localhost;
root /mnt/blog/;
location / {
}
#要快取檔案的字尾,可以在以下設定。
location ~ .*\.(gif|jpg|png|css|js)(.*) {
proxy_pass http://ip地址:90;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 301 30d;
proxy_cache_valid any 5m;
expires 90d;
add_header wall "hey!guys!give me a star.";
}
}
# 無nginx快取的blog埠
server {
listen 90;
server_name localhost;
root /mnt/blog/;
location / {
}
}
}
複製程式碼
因為我是在一臺伺服器上做試驗(敲重點,做試驗),所以用了兩個埠80
和90
進行模擬兩臺伺服器之間的互動。
80
埠對接的是普通的域名(http://wangxiaokai.vip
)訪問。
90
埠負責處理80
埠代理過來的資源訪問。
相當於90
埠是源伺服器,80
埠是nginx反向快取代理伺服器。
接下來講一下配置項:
2.1 http層設定
proxy_connect_timeout 10;
proxy_read_timeout 180;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 96k;
proxy_temp_file_write_size 96k;
proxy_temp_path /tmp/temp_dir;
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g;
複製程式碼
- proxy_connect_timeout
伺服器連線的超時時間
- proxy_read_timeout
連線成功後,等候後端伺服器響應時間
- proxy_send_timeout
後端伺服器資料回傳時間
- proxy_buffer_size
緩衝區的大小
- proxy_buffers
每個連線設定緩衝區的數量為number,每塊緩衝區的大小為size
- proxy_busy_buffers_size
開啟緩衝響應的功能以後,在沒有讀到全部響應的情況下,寫緩衝到達一定大小時,nginx一定會向客戶端傳送響應,直到緩衝小於此值。
- proxy_temp_file_write_size
設定nginx每次寫資料到臨時檔案的size(大小)限制
- proxy_temp_path
從後端伺服器接收的臨時檔案的存放路徑
- proxy_cache_path
設定快取的路徑和其他引數。被快取的資料如果在inactive引數(當前為1天)指定的時間內未被訪問,就會被從快取中移除
2.2 server層設定
2.2.1 反向快取代理伺服器
server {
listen 80 default_server;
server_name localhost;
root /mnt/blog/;
location / {
}
#要快取檔案的字尾,可以在以下設定。
location ~ .*\.(gif|jpg|png|css|js)(.*) {
proxy_pass http://ip地址:90;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 301 30d;
proxy_cache_valid any 5m;
expires 90d;
add_header wall "hey!guys!give me a star.";
}
}
複製程式碼
- proxy_pass
nginx快取裡拿不到資源,向該地址轉發請求,拿到新的資源,並進行快取
- proxy_redirect
設定後端伺服器“Location”響應頭和“Refresh”響應頭的替換文字
- proxy_set_header
允許重新定義或者新增發往後端伺服器的請求頭
- proxy_cache
指定用於頁面快取的共享記憶體,對應http層設定的keys_zone
- proxy_cache_valid
為不同的響應狀態碼設定不同的快取時間
- expires
快取時間
這裡我設定了圖片
、css
、js
靜態資源進行快取。
當使用者輸入http://wangxiaokai.vip
域名時,解析得到ip:port
的訪問地址。port
預設為80。所以頁面請求會被當前server擷取到,進行請求處理。
當解析到上述檔名結尾的靜態資源,會到快取區獲取靜態資源。
如果獲取到對應資源,則直接返回資料。
如果獲取不到,則將請求轉發給proxy_pass
指向的地址進行處理。
2.2.2 源伺服器
server {
listen 90;
server_name localhost;
root /mnt/blog/;
location / {
}
}
複製程式碼
這裡直接處理90
埠接受到的請求,到伺服器本地目錄/mnt/blog
下抓取資源進行響應。
三、如何驗證快取是否有效
細心的讀者應該發現,我在第二段的栗子裡,留了個彩蛋 add_header wall "hey!guys!give me a star."
。
add_header
是用於在報頭設定自定義的資訊。
所以,如果快取有效的話,那麼靜態資源返回的報頭,一定會帶上這個資訊。
訪問http://wangxiaokai.vip
結果如下:
四、參考
[1] nginx文件
[2] nginx反向快取代理詳解
[3] Nginx快取伺服器靜態檔案
五、後記
我的GitHub倉庫
Give me a star,if it's work out for you.Thank you.