使用nginx緩存伺服器上的靜态檔案
一、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
端口是nginx反向緩存代理伺服器。
80
接下來講一下配置項:
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
結果如下: