標題索引php
追朔緣由css
實驗分解html
抓包分析java
追朔緣由【此文須要待續】nginx
當下是互聯網時代也是CDN緩存時代,緩存能夠提供互聯網80%流量,所以緩存的構建和提升緩存的命中率是互聯網行業必不可少的方式和手段,另外在http1.1協議盛行的時代,需很是瞭解http協議才能對apache、nginx、haproxy等服務器原理了解更爲透徹,互聯網CDN內容發佈商緩存命中率才能大大提供,用戶才能獲得好的體驗。
apache
實驗分解後端
當客戶端瀏覽器cache-control:max-age=0時,表示緩存服務器一般須要將請求轉發給源服務器(具體可參考圖解http協議書籍89頁);
瀏覽器
當客戶端瀏覽器cache-control:max-age>0時,表示客戶端能夠從緩存服務器端直接獲取數據。
緩存
vcl 4.0; #------------------------------------------------------- #裝載負載均衡模塊 import directors; import std; #------------------------------------------------------- #在全局配置中配置acl,在recv函數中調用acl acl aclpurges { "192.168.40.2"/24; "127.0.0.1"/24; } #------------------------------------------------------- #定義健康性檢測,方便backend後端調用 probe healthcheck { .url = "/index.html"; .window = 5; .threshold = 4; .interval = 10s; .timeout = 2s; } #-------------------------------------------------------- #定義backend後端服務器 backend phpserver01 { .host = "192.168.40.1"; .port = "80"; .probe = healthcheck; } backend phpserver02 { .host = "192.168.40.2"; .port = "80"; .probe = healthcheck; } backend picserver11 { .host = "192.168.40.11"; .port = "80"; .probe = healthcheck; } backend picserver12 { .host = "192.168.40.12"; .port = "80"; .probe = healthcheck; } backend javaserver21{ .host = "192.168.40.21"; .port = "80"; .probe = healthcheck; } backend javaserver22{ .host = "192.168.40.22"; .port = "80"; .probe = healthcheck; } #vcl初始化組信息 sub vcl_init{ #定義後端服務器組 #若需會話綁定時 #new php_group = directors.hash(); new php_group = directors.round_robin(); new pic_group = directors.round_robin(); new java_group = directors.round_robin(); #default_group php_group.add_backend(phpserver01); php_group.add_backend(phpserver02); #picserver_group pic_group.add_backend(picserver11); pic_group.add_backend(picserver12); #javaserver_group java_group.add_backend(javaserver21); java_group.add_backend(javaserver22); } #-------------------------------------------------------- sub vcl_recv { #+++++++對不一樣資源進行分離調度 #若需會話綁定時,分組中已經組,只需根據cookie進行hash #set req.backend_hint = php_group.backend(req.http.cookie); if (req.url ~ "(?i)\.(jpg|jpeg|png|gif)$"){ set req.backend_hint = pic_group.backend(); } if (req.url ~ "(?i)\.(jsp)"){ set req.backend_hint = java_group.backend(); }else{ set req.backend_hint = php_group.backend(); } #+++++++對特定資源直接調用pass函數進行反向代理 if ( req.url ~ "(?i)^/(login|admin)"){ return(pass); } #+++++++對URL發生改變的請求,即URL重寫的請求X-forwarded-For if (req.restarts == 0 ){ if (req.http.X-Forwarded-For) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + "," + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } #+++++++對緩存資源進行修剪,默認基於URL進行緩存,修剪時需保持URL不變 if ( req.method == "PURGE" ){ if ( !client.ip ~ aclpurges) { #訪問時http://172.18.27.24/123.jpg #修剪時curl -X PURGE http://172.18.27.24/123.jpg return(synth(405,"You are not allowed" + client.ip)); } return (purge); } #+++++++當對一類資源進行修改時能夠經過varnishadmin命令行修剪 #如:ban req.rul ~ (?i).(jpg|pgn)批量進行修剪 if (req.method != "GET" && req.method != "HEAD") { return (pipe); } #+++++++定義緩存的內容 if (req.url ~ "\.(jpe?g|png|gif|pdf|gz|tgz|bz2|tbz|tar|zip|tiff|tif)$" || req.url ~ "/(p_w_picpath|(p_w_picpath_(?:[^/]|(?!view.*).+)))$") { return (hash); } if (req.url ~ "\.(svg|swf|ico|mp3|mp4|m4a|ogg|mov|avi|wmv|flv)$") { return (hash); } if (req.url ~ "\.(xls|vsd|doc|ppt|pps|vsd|doc|ppt|pps|xls|pdf|sxw|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm)$") { return (hash); } if (req.url ~ "\.(css|js)$") { return (hash); } if (req.http.Authorization || req.http.Cookie ~ "(^|; )(__ac=|_ZopeId=)") { /* Not cacheable by default */ return (pipe); } } #-------------------------------------------------------- sub vcl_backend_response { #+++++++對特定資源強行進行緩存 if ( beresp.http.cache-control !~ "s-maxage" ) { if ( bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js)$" ) { unset beresp.http.Set-Cookie; set beresp.ttl = 3600s; } } #定義緩存策略 if (beresp.ttl <= 0s || beresp.http.Set-Cookie || beresp.http.Vary == "*") { # Mark as "Hit-For-Pass" for the next 60 minutes - 24 hours if (bereq.url ~ "\.(jpe?g|png|gif|pdf|gz|tgz|bz2|tbz|tar|zip|tiff|tif)$" || bereq.url ~ "/(p_w_picpath|(p_w_picpath_(?:[^/]|(?!view.*).+)))$") { set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 6h; } elseif (bereq.url ~ "\.(svg|swf|ico|mp3|mp4|m4a|ogg|mov|avi|wmv|flv)$") { set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 6h; } elseif (bereq.url ~ "\.(xls|vsd|doc|ppt|pps|vsd|doc|ppt|pps|xls|pdf|sxw|rar|odc|odb|odf|odg|odi|odp|ods|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm)$") { set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 6h; } elseif (bereq.url ~ "\.(css|js)$") { set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 24h; } else { set beresp.ttl = std.duration(beresp.http.age+"s",0s) + 1h; } } } #--------------------------------------------------------- sub vcl_deliver { #構建http報頭時添加命中或非命中字段 if (obj.hits>0) { set resp.http.X-cache = "Hit via" + server.ip; } else { set resp.http.X-cache = "Miss from" + server.ip; } } #---------------------------------------------------------- #varnish優化, #在運行時進行調整相關參數,經過命令進行調整, #thread_pools:最大池子數 param.set thread_pools 4 #thread_pool_max:池子最大線程數 param.set thread_max 8000 #thread_pool_min:池子最小線程數 param.set thread_max 500 #永久性優化時,經過編寫配置文件進行調整參數 #DAEMON_OPTS="-p thread_pool_min=500 -p thread_pool_max=8000 -p thread_pools=4"