使用nginx快取伺服器上的靜態檔案

我是leon發表於2018-05-10

一、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 / {

        }
    }
}
複製程式碼

因為我是在一臺伺服器上做試驗(敲重點,做試驗),所以用了兩個埠8090進行模擬兩臺伺服器之間的互動。

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 快取時間

這裡我設定了圖片cssjs靜態資源進行快取。 當使用者輸入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結果如下:

nginx快取結果

四、參考

[1] nginx文件
[2] nginx反向快取代理詳解
[3] Nginx快取伺服器靜態檔案

五、後記

我的GitHub倉庫
Give me a star,if it's work out for you.Thank you.

相關文章