nginx的ngx_http_proxy_module自帶了緩存功能,下面介紹幾個經常使用的指令以及如何配置。html
nginx緩存的內容是放在磁盤中的,因此咱們須要定義存放緩存的載體,proxy_cache_path設置緩存的路徑和其餘參數。緩存中的文件名爲proxy_cache_key定義的字符串的hash結果nginx
語法 | proxy_cache_path path [levels=levels][use_temp_path=on丨off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on丨off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; |
---|---|
默認 | - |
應用位置 | http |
用來指定使用哪一個共享內存,使用proxy_cache_path中的name來引用git
語法 | proxy_cache zone 丨 off; |
---|---|
默認 | proxy_cache off; |
應用位置 | http,server,location |
定義緩存的key,將以key的hash值做爲緩存文件名 github
語法 | proxy_cache_key string; |
---|---|
默認 | proxy_cache_key $ scheme $ proxy_host $ request_uri; |
應用位置 | http,server,location |
用於設置不一樣響應代碼的緩存時間後端
語法 | proxy_cache_valid [code ...] time; |
---|---|
默認 | - |
應用位置 | http,server,location |
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid 5m; proxy_cache_valid any 1m;
以上代碼表示狀態碼爲200和302的緩存有效期爲10分鐘,狀態碼爲404的緩存有效期爲1分鐘,若是不指定狀態碼,那麼只有緩存狀態碼200,301和302各五分鐘,any表示緩存任何響應瀏覽器
定義不將響應保存到緩存的條件。當字符串參數爲真時,則響應不會保存到緩存緩存
語法 | proxy_no_cache string ...; |
---|---|
默認 | - |
應用位置 | http,server,location |
定義不從緩存中獲取響應的條件,當字符串參數爲真時,則不會從緩存中獲取響應服務器
語法 | proxy_cache_bypass string ...; |
---|---|
默認 | - |
應用位置 | http,server,location |
$upstream_cache_status是一個位於ngx_http_upstream_module模塊來顯示緩存狀態的變量,能夠在配置中添加一個http頭來顯示此變量的值app
爲驗證緩存,這裏我將緩存超時時間設爲1分鐘 ide
proxy_cache_path /data/cache levels=1:2 keys_zone=cache:10m max_size=100m inactive=1m use_temp_path=off; server { listen 80; server_name wanger.com; include /etc/nginx/default.d/*.conf; location /wanger { proxy_pass http://192.168.0.52; proxy_cache cache; proxy_cache_valid 200 301 1m; add_header X-Cache $upstream_cache_status; proxy_cache_key $host$uri; } }
能夠看到第一次訪問並無命中緩存,而第二次訪問的時候已經創建好緩存了
查看緩存目錄,能夠看到緩存文件已經存在,而且前兩級的目錄名是緩存文件名的後三個字符
進入後端服務器,添加響應頭字段X-Accel-Expires,並將值設置爲3
server { listen 80; server_name localhost; add_header X-Accel-Expires 3; location / { root html; index index.html; } }
再次進行測試,能夠看到第一次請求顯示緩存已通過期
再次進入後端服務器,添加響應頭字段Vary,並將其值設置爲"*",並進行測試
server { listen 80; server_name localhost; add_header X-Accel-Expires 3; add_header Vary *; location / { root html; index index.html; } }
能夠看到index.htm文件一直沒有被緩存
nginx提供了一個第三方模塊ngx_cache_purge,GitHub地址:https://github.com/FRiCKLE/ngx_cache_purge
安裝ngx_cache_purge模塊須要從新編譯nginx,並使用--add-module=模塊位置參數添加模塊到nginx裏
這裏須要用到proxy_cache_purge指令
語法 | proxy_cache_purge zone_name key |
---|---|
默認 | - |
應用位置 | location |
location ~ /purge(/.*) { proxy_cache_purge cache $host$1; } location /wanger { proxy_pass http://192.168.0.52; proxy_cache cache; proxy_cache_valid 200 301 1m; add_header X-Cache $upstream_cache_status; proxy_cache_key $host$uri; }
因爲我緩存過時時間設置的是1分鐘,當我命中緩存以後,就開始進行緩存清理測試,以後在一分鐘內再次訪問同一個URL,就發現緩存命中失敗了
gzip壓縮模塊提供了壓縮文件內容的功能,經過壓縮可使服務器與瀏覽器之間傳輸的數據量更小,提升了客戶端的響應速度,但壓縮也會消耗nginx性能
server { listen 80; server_name 192.168.0.168; gzip on; gzip_types image/jpeg; gzip_buffers 32 4K; gzip_min_length 100; gzip_comp_level 6; gzip_vary on; }
瀏覽器要禁用瀏覽器緩存,能夠看到壓縮以後圖片大小是75.9KB,響應頭中也會多一個字段Content-Encoding: gzip
將gzip參數修改成off,重載nginx,再來看圖片大小爲76.4KB
歡迎各×××陳師傅」