『壹』 NGINX proxy 模塊如何如何緩存動態頁面內容如何讓緩存過期
這里用虛擬機配置了下:
nginx 配置文件內容:
主要是這一句:
proxy_cache_path /www/ levels=1:2 keys_zone=Z:10m inactive=1m max_size=30g;
這一句定義一個區域,名字是 Z ,在內存中的空間為10MB ,硬碟中的最大空間為 30G;
inactive=1m 是,1分鍾之後緩存失效 ,從新從源伺服器請求
這里糾正一下,inactive=1m 如果緩存1分鍾沒人訪問,nginx 會刪除掉這些緩存
/usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
proxy_cache_path /www/ levels=1:2 keys_zone=Z:10m inactive=1m max_size=30g;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /www/;
#expires max;
#proxy_store on;
#proxy_store_access user:rw group:rw all:rw;
#proxy_temp_path /www/;
proxy_cache Z;
proxy_cache_valid 200 1m;
#expires max;
include proxy.conf;
if ( !-e $request_filename) {
proxy_pass http://192.168.1.199:45815;
}
}
#這里設置當 訪問 /ajax/目錄下的內容時候,直接從源伺服器讀取,主要用於ajax 的訪問請求,要求實時的
location /ajax/ {
include proxy.conf;
if ( !-e $request_filename) {
proxy_pass http://192.168.1.199:45815;
}
}
#location ~.*\.(jpg|png|jpeg|gif)
#{
# expires max;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
/usr/local/nginx/conf/proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding 'gzip';
client_max_body_size 100m;
client_body_buffer_size 256k;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 512k;
proxy_buffers 8 512k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
一開始我就這樣配置,認為可以成功了,結果發現動態文件無法被緩存,而html 文件可以被緩存,後來就到很多地方去問,
心想會不會是因為 文件 的 頭信息或者Last-Modified
信息和 ETag 造成的,就去問,http://www.dewen.org/q/9769/nginx+%E5%A6%82%E4%BD%95%E7%BC%93%E5%AD%98%E5%8A%A8%E6%80%81%E9%A1%B5%E9%9D%A2%EF%BC%9F
發現果真如此,馬上修改源伺服器的動態文件,加入以下代碼:
<%@ Page Language="C#" %>
<%
string date = Request.Headers.Get("If-Modified-Since");
if (date != null)
{
Response.StatusCode = 304;
Response.StatusDescription = "from cache";
return;
}
DateTime expDate = new DateTime(2037, 12, 31, 23, 55, 55);
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(expDate);
Response.Cache.SetMaxAge(expDate - DateTime.Now);
Response.Cache.SetLastModified(new DateTime(2000, 1, 1));
%>
<%=DateTime.Now.ToString()%>
然後發現就可以緩存動態文件了。至此,下一步我就可以用nginx 作為用戶訪問的 伺服器了
這里截一些圖:
『貳』 nginx 緩存機制
Nginx緩存的基本思路
基本思想是利用客戶訪問的時間局部性原理,對客戶已經訪問過的內容在Nginx伺服器本地建立副本,這樣在一段時間內再次訪問該數據,就不需要通過Nginx伺服器再次向後端伺服器發出請求,所以能夠減少Nginx伺服器與後端伺服器之間的網路流量,減輕網路擁塞,同時還能減小數據傳輸延遲,提高用戶訪問速度。同時,當後端伺服器宕機時,Nginx伺服器上的副本資源還能夠回應相關的用戶請求,這樣能夠提高後端伺服器的魯棒性。
對於緩存,我們大概會有以下問題:
(1)緩存文件放在哪兒?
(2)緩存的空間大小是否可以限定?
(3)如何指定哪些請求被緩存?
(4)緩存的有效期是多久?
(5)對於某些請求,是否可以不走緩存?
解決這些問題後,nginx的緩存也就基本配置完成了,下面看詳細配置過程
開啟緩存
要使用緩存,首先要使用 proxy_cache_path 這個指令(必須放在 http 上下文的頂層位置),然後在目標上下文中使用 proxy_cache 指令
配置示例
proxy_cache_path 有兩個必填參數,第一個參數為 緩存目錄,第二個參數keys_zone指定緩存名稱和佔用內存空間的大小(註:示例中的10m是對內存中緩存內容元數據信息大小的限制,如果想限制緩存總量大小,需要用 max_size 參數)
proxy_cache 的參數為之前指定的緩存名稱
緩存管理的相關進程
在緩存工作中有兩個附加進程:
(1)緩存管理器
定期檢查緩存狀態,看緩存總量是否超出限制,如果超出,就移除其中最少使用的部分
(2)緩存載入器
載入器只在nginx啟動後運行一次,把緩存內容的元數據信息載入到內存空間,如果一次性載入全部緩存信息,會大量消耗資源,使nginx在啟動後的幾分鍾里變慢,為避免此問題,有3種載入策略:
loader_threshold – 指定每次載入執行的時間
loader_files – 每次最多載入的數量
loader_sleeps – 每次載入的延時
例如:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
指定緩存哪些請求
nginx默認會緩存所有 get 和 head 方法的請求結果,緩存的key默認使用請求字元串
(1)自定義key
例如 proxy_cache_key " request_uri cookie_nocache arg_comment;
如果任何一個參數值不為空,或者不等於0,nginx就不會查找緩存,直接進行代理轉發
綜合示例
nginx 緩存機制
三分鍾看懂Nginx伺服器的緩存原理和機制
『叄』 nginx gzip 壓縮比 多少好
隨著壓縮率的提高,所消耗的CPU也會越來越多,建議值是4,但是DavidYin的建議是直接用5。因為每提高一級壓縮,數據就減少大約2到3KB,而從5到6,只有減少大約0.5KB,再之後也幾乎沒有什麼變化了。所以就直接設置 gzip_comp_level 5
對於CPU的消耗,我覺得還是不是那麼的厲害,畢竟靜態文件,還可以設置過期頭,讓它的有效緩存期長一點,比如設置成半年一年的。實際上CPU的壓力在這上面是沒有那麼大的。
『肆』 Nginx 配置靜態壓縮(ngx_http_gzip_static_mole)
Nginx提供靜態壓縮功能,對於比較大的文件,可以自動默認查找.gz後綴的壓縮包。減小項目工程的大小。
對於支持gzip的請求反向代理緩存伺服器將返回gzip內容,不支持gzip的客戶端返回原始內容。
『伍』 nginx優化以及多級緩存
配置文件:
lua是一個小巧的腳本語言,由標准C編寫而成,幾乎在所有操作系統和平台上都可以編譯運行。其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。
應用場景:游戲開發、獨立應用腳本、redis中嵌套調用實現類似事務的功能,web容器匯總處理NGINX的過濾緩存等等邏輯
OpenResty是一個基於Nginx與Lua的高性能web平台,由中國人章亦春發起,其內部集成了大量精良的Lua庫、第三方模塊以及大多數的依賴項。用於方便搭建能處理超高並發、擴展性極高的動態Web應用、web服務和動態網關
OpenResty簡單理解成就相當於封裝了NGINX,並且集成了LUA腳本,開發人員只需要簡單的使用其提供了模塊就可以實現相關的邏輯,而不像之前,還需要在NGINX中編寫lua的腳本。
1.拉取一個openresty的鏡像
2.隨便構建一個容器用於拷貝配置文件
3.進入容器,查找配置文件路徑(這里直接給出)
4.退出容器,復制容器中配置文件到宿主機
5.修改配置文件
1、使用Lua查詢Nginx緩存,如果有緩存,則直接將緩存中的分類數據返回
2、如果Nginx緩存中沒有分類數據,則通過Lua腳本查詢Redis,如果Redis中有數據,則將數據存入到Nginx緩存中,並返回查詢到的數據
3、如果Redis中也沒有緩存,則此時通過Lua腳本查詢Mysql,如果Mysql中有數據,將分類數據存入到Redis緩存,並返回數據
『陸』 nginx開啟gzip
nginx實現資源壓縮的原理是通過ngx_http_gzip_mole模塊攔截請求,並對需要做gzip的類型做gzip壓縮,該模塊是默認基礎的,不需要重新編譯,直接開啟即可。
1.nginx的response headers中的Content-Encoding是gzip
2.返迴文件大小明顯被壓縮
1.直接在瀏覽器通過開發者工具查看請求頭、返回頭等信息
2.使用curl命令行curl -I -H"Accept-Encoding: gzip, deflate" " http://www.example.com "
3.站長工具中的 網頁Gzip檢測
1.先檢查gzip_types中是否包含需要的類型
2.如果公司存在多層緩存機制,確認每一層都開啟了gzip壓縮
3.開啟 gzip_static on,確認伺服器上是否存在.gz文件
『柒』 nginx 緩存怎麼都在tmp
nginx緩存cache的5種方案
1、傳統緩存之一(404)
這個辦法是把nginx的404錯誤定向到後端,然後用proxy_store把後端返回的頁面保存。
配置:
location / {
root /home/html/;#主目錄
expires 1d;#網頁的過期時間
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目錄下
}
location /fetch/ {#404定向到這里
internal;#指明這個目錄不能在外部直接訪問到
expires 1d;#網頁的過期時間
alias /html/;
proxy_store會將文件保存到這目錄下
proxy_passhttp://www.jb51.net/;#後端upstream地址,/fetch同時是一個代理
proxy_set_header Accept-Encoding '';#讓後端不要返回壓縮(gzip或deflate)的內容,保存壓縮後的內容會引發亂子。
proxy_store on;#指定nginx將代理返回的文件保存
proxy_temp_path /home/tmp;#臨時目錄,這個目錄要和/home/html在同一個硬碟分區內
}
使用的時候還有要注意是nginx要有許可權往/home/tmp和/home/html下有寫入文件的許可權,在linux下nginx一般會配
置成nobody用戶運行,這樣這兩個目錄就要chown nobody,設成nobody用戶專用,當然也可以chmod
777,不過所有有經驗的系統管理員都會建議不要隨便使用777。
2、傳統緩存之二(!-e)
原理和404跳轉基本一致,但更簡潔一些:
location / {
root /home/html/;
proxy_store on;
proxy_set_header Accept-Encoding '';
proxy_temp_path /home/tmp;
if ( !-f $request_filename )
{
proxy_passhttp://www.jb51.net/;
}
}
可以看到這個配置比404節約了不少代碼,它是用!-f來判斷請求的文件在文件系統上存不存在,不存在就proxy_pass到後端,返回同樣是用proxy_store保存。
兩種傳統緩存都有著基本一樣的優點和缺點:
缺點1:不支持帶參數的動態鏈接,比如read.php?id=1,因為nginx只保存文件名,所以這個鏈接只在文件系統下保存為
read.php,這樣用戶訪問read.php?id=2時會返回不正確的結果。同時不支持http://www.jb51.net/這種形式的首頁和
二級目錄http://www.jb51.net/download/,因為nginx非常老實,會將這樣的請求照鏈接寫入文件系統,而這個鏈接顯然是一
個目錄,所以保存失敗。這些情況都需要寫rewrite才能正確保存。
缺點2:nginx內部沒有緩存過期和清理的任何機制,這些緩存的文件會永久性地保存在機器上,如果要緩存的東西非常多,那就會撐暴整個硬碟空間。為此可以使用一個shell腳本定期清理,同時可以撰寫php等動態程序來做實時更新。
缺點3:只能緩存200狀態碼,因此後端返回301/302/404等狀態碼都不會緩存,假如恰好有一個訪問量很大的偽靜態鏈接被刪除,那就會不停穿透導致後端承載不小壓力。
缺點4:nginx不會自動選擇內存或硬碟作為存儲介質,一切由配置決定,當然在當前的操作系統里都會有操作系統級的文件緩存機制,所以存在硬碟上也不需要過分擔心大並發讀取造成的io性能問題。
nginx傳統緩存的缺點也是它和squid等緩存軟體的不同之特色,所以也可看作其優點。在生產應用中它常常用作和squid的搭檔,squid對
於帶?的鏈接往往無法阻擋,而nginx能將其訪問攔住,例如:http://jb51.net/?和http://jb51.net/在squid上會
被當做兩個鏈接,所以會造成兩次穿透;而nginx只會保存一次,無論鏈接變成http://jb51.net/?1還是http://jb51.net
/?123,均不能透過nginx緩存,從而有效地保護了後端主機。
nginx會非常老實地將鏈接形式保存到文件系統中,這樣對於一個鏈接,可以很方便地查閱它在緩存機器上的緩存狀態和內容,也可以很方便地和別的文件管理器如rsync等配合使用,它完完全全就是一個文件系統結構。
這兩種傳統緩存都可以在linux下將文件保存到/dev/shm里,一般我也是這么做的,這樣可以利用系統內存來做緩存,利用內存的話,清理過期內
容速度就會快得多。使用/dev/shm/時除了要把tmp目錄也指向到/dev/shm這個分區外,如果有大量小文件和目錄,還要修改一下這個內存分區
的inode數量和最大容量:
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
上面的命令在一台有3G內存的機器上使用,因為/dev/shm默認最大內存是系統內存的一半就是1500M,這條命令將其調大成2500M,
同時shm系統inode數量默認情況下可能是不夠用的,但有趣的是它可以隨意調節,這里調節為480000保守了點,但也基本夠用了。
3、基於memcached的緩存
nginx對memcached有所支持,但是功能並不是特別之強,性能上還是非常之優秀。
location /mem/ {
if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
set $memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
expires 70;
}
這個配置會將http://jb51.net/mem/abc指明到memcached的abc這個key去取數據。
nginx目前沒有寫入memcached的任何機制,所以要往memcached里寫入數據得用後台的動態語言完成,可以利用404定向到後端去寫入數據。
4、基於第三方插件ncache
ncache是新浪兄弟開發的一個不錯的項目,它利用nginx和memcached實現了一部分類似squid緩存的功能,我並沒有使用這個插件的經驗,可以參考:
http://code.google.com/p/ncache/
5、nginx新開發的proxy_cache功能
從nginx-0.7.44版開始,nginx支持了類似squid較為正規的cache功能,目前還處於開發階段,支持相當有限,這個緩存是把鏈接用md5編碼hash後保存,所以它可以支持任意鏈接,同時也支持404/301/302這樣的非200狀態。
配置:
首先配置一個cache空間:
復制代碼 代碼如下:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;
注意這個配置是在server標簽外,levels指定該緩存空間有兩層hash目錄,第一層目錄是1個字母,第二層為2個字母,保存的文件名就會類
似/path/to/cache/c/29/;keys_zone為這個空間起個名
字,10m指空間大小為10MB;inactive的5m指緩存默認時長5分鍾;max_size的2m是指單個文件超過2m的就不緩
存;clean_time指定一分鍾清理一次緩存。
location / {
proxy_passhttp://www.jb51.net/;
proxy_cache NAME;#使用NAME這個keys_zone
proxy_cache_valid 200 302 1h;#200和302狀態碼保存1小時
proxy_cache_valid 301 1d;#301狀態碼保存一天
proxy_cache_valid any 1m;#其它的保存一分鍾
}
ps:支持cache的0.7.44到0.7.51這幾個版本的穩定性均有問題,訪問有些鏈接會出現錯誤,所以這幾個版本最好不要在生產環境中
使用。nginx-0.7下目前所知較為穩定的版本是0.7.39。穩定版0.6.36版也是近期更新,如果在配置里沒有使用到0.7的一些新標簽新功
能,也可以使用0.6.36版。
Nginx緩存的內存佔用問題的一般解決方法
1、前些日子某服務被刷,每分鍾達到上幾百萬請求;當時採用了nginx cache來解決的;但是因為某服務不能緩存太久,當時設置了5s,那麼帶來的問題就是產生大量小文件,而且很快就刪除了。
2、通過
free -m
會發現used是27G;但是通過top查看進程占的內存並沒有那麼多
那內存去哪了?
3、通過查閱資料會發現(cat /proc/meminfo)
Slab: 22464312 kB
SReclaimable: 16474128 kB (這些是內核保持的但是可以釋放的inode和dentry的緩存)
SUnreclaim: 5990184 kB
4、這些內存為什麼會不自動清理呢?
某機房機器系統版本:Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux(正常,沒出現內存快到100%的情況)
某機房機器系統版本:Linux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux (不釋放)
5、通過設置如下參數來設置內存閥值
sysctl -w vm.extra_free_kbytes=6436787
sysctl -w vm.vfs_cache_pressure=10000
『捌』 深入Nginx + PHP 緩存詳解
以下是對Nginx中的PHP緩存進行了詳細的分析介紹 需要的朋友可以參考下Nginx緩存 nginx有兩種緩存機制:fastcgi_cache和proxy_cache 下面我們來說說這兩種緩存機制的區別吧 proxy_cache 作用是緩存後端伺服器的內容 可能是任何內容 包括靜態的和動態的 fastcgi_cache 作用是緩存fastcgi生成的內容 很多情況是php生成的動態內容 proxy_cache 緩存減少了nginx與後端通信的次數 節省了傳輸時間和後端帶寬 fastcgi_cache 緩存減少了nginx與php的通信次數 更減輕了php和資料庫的壓力 proxy_cache 緩存設置
復制代碼 代碼如下: #注 proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區 proxy_temp_path /data /proxy_temp_dir; #設置Web緩存區名稱為cache_one 內存緩存空間大小為 MB 天沒有被訪問的內容自動清除 硬碟緩存空間大小為 GB proxy_cache_path /data /proxy_cache_dir levels= : keys_zone=cache_one: m inactive= d max_size= g; server { listen ; server_name yourdomain ; index index index ; root /data /htdocs/; location / { #如果後端的伺服器返回 執行超時等錯誤 自動將請求轉發到upstream負載均衡池中的另一台伺服器 實現故障轉移 proxy_next_upstream _ _ error timeout invalid_header; proxy_cache cache_one; #對不同的HTTP狀態碼設置不同的緩存時間 proxy_cache_valid h; #以域名 URI 參數組合成Web緩存的Key值 Nginx根據Key值哈希 存儲緩存內容到二級緩存目錄內 proxy_cache_key $host$uri$is_args$args; proxy_set_header Host $host; proxy_set_header X Forwarded For $remote_addr; proxy_pass //backend_server; expires d; } #用於清除緩存 假設一個URL為 通過訪問就可以清除該URL的緩存 location ~ /purge(/ *) { #設置只允許指定的IP或IP段才可以清除URL緩存 allow ; allow / ; deny all; proxy_cache_purge cache_one $host$ $is_args$args; } #擴展名以 php jsp cgi結尾的動態應用程序不緩存 location ~ * (php|jsp|cgi)?$ { proxy_set_header Host $host; proxy_set_header X Forwarded For $remote_addr; proxy_pass //backend_server; } access_log off; } }fastcgi_cache緩存設置
復制代碼 代碼如下: #定義緩存存放的文件夾 fastcgi_cache_path /tt/cache levels= : keys_zone=NAME: m inactive= d max_size= G; #定義緩存不同的url請求 fastcgi_cache_key "$scheme$request_method$host$uri$arg_filename$arg_x$arg_y"; server { listen ; server_name example ; location / { root /; index index index index php; } location ~ (| php)$ { root /; fastcgi_pass : ; fastcgi_cache NAME; fastcgi_cache_valid h; fastcgi_cache_min_uses ; fastcgi_cache_use_stale error timeout invalid_header _ ; fastcgi_index index php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi conf; #設置緩存的過程中發現無法獲取cookie 經查需要定義這句話 fastcgi_pass_header Set Cookie; } log_format access $remote_addr $remote_user [$time_local] "$request" $status $body_bytes_sent "$_referer" "$_user_agent" $_x_forwarded_for ; access_log / }總的來說 nginx的proxy_cache和fastcgi_cache的緩存配置差不多 memcache緩存 在討論memcache緩存之前 我們先了解下mysql的內存緩存吧 mysql的內存緩存可以在my cnf中指定大小 內存表和臨時表不同 臨時表也是存放內存中 臨時表最大的內存需要通過tmp_table_size= M設定 當數據查過臨時表的最大值設定時 自動轉為磁碟表 此時因需要進行IO操作 性能會大大下降 而內存表不會 內存滿了後 會提示數據滿錯誤 例
復制代碼 代碼如下: create table test ( id int unsigned not null auto_increment primary key state char( ) type char( ) date char( ) )engine=memory default charset=utf lishixin/Article/program/PHP/201311/21248
『玖』 瀏覽器緩存和伺服器緩存
一、瀏覽器緩存
瀏覽器緩存即http緩存;瀏覽器緩存根據是否需要向伺服器重新發起HTTP請求將緩存過程分為兩個部分,分別是 強制緩存 和 協商緩存 。
瀏覽器第一次請求資源的時候伺服器會告訴客戶端是否應該緩存資源,根據響應報文中HTTP頭的緩存標識,決定是否緩存結果,是則將請求結果和緩存標識存入瀏覽器緩存中。如下圖:
1.強制緩存 :瀏覽器會對緩存進行查找,並根據一定的規則確定是否使用緩存。
強制緩存的緩存規則?
HTTP/1.0 Expires 這個欄位是絕對時間,比如2018年6月30日12:30,然後在這個時間點之前的請求都會使用瀏覽器緩存,除非清除了緩存。
這個欄位的缺點就是只會同步客戶端的時間,這就有可能修改客戶端時間導致緩存失效。
HTTP/1.1 cache-Control 這個是1.1的時候替換Expires的,它會有幾種取值:
public :所有內容都將被緩存(客戶端和代理伺服器都可緩存)
private :所有內容只有客戶端可以緩存, Cache-Control的默認取值
no-cache :客戶端緩存內容,但是是否使用緩存則需要經過協商緩存來驗證決定
no-store :所有內容都不會被緩存,即不使用強制緩存,也不使用協商緩存
max-age=xxx (xxx is numeric) :緩存內容將在xxx秒後失效
比如max-age=500,則在500秒內再次請求會直接只用緩存。
優先性:cache-Control > Expires
如果同時存在,cache-Control會覆蓋Expires。
這個欄位的缺點就是:
如果資源更新的速度是秒以下單位,那麼該緩存是不能被使用的,因為它的時間單位最低是秒。
如果文件是通過伺服器動態生成的,那麼該方法的更新時間永遠是生成的時間,盡管文件可能沒有變化,所以起不到緩存的作用。
上圖中瀏覽器緩存中存在該資源的緩存結果,並且沒有失效,就會直接使用緩存的內容。
上圖中瀏覽器緩存中沒有該資源的緩存結果和標識,就會直接向伺服器發起HTTP請求。
2.協商緩存: 瀏覽器的強制緩存失效後(時間過期),瀏覽器攜帶緩存標識請求伺服器,由伺服器決定是否使用緩存。
伺服器決定的規則?
控制協商緩存的欄位有 Last-Modified / If-Modified-Since 和 Etag / If-None-Match。
①Last-Modified 是伺服器返回給瀏覽器的本資源的最後修改時間。
當下次再次請求的時候,瀏覽器會在請求頭中帶 If-Modified-Since ,即上次請求下來的 Last-Modified 的值,
然後伺服器會用這個值和該資源最後修改的時間比較,如果最後修改時間大於這個值,則會重新請求該資源,返回狀態碼200。
如果這個值和最後修改時間相等,則會返回304,告訴瀏覽器繼續使用緩存。
② Etag 是伺服器返回的一個hash值。
當下次再次請求的時候,瀏覽器會在請求頭中帶 If-None-Match ,即上次請求下來的 Etag 值,
然後伺服器會用這個值和該資源在伺服器的 Etag 值比較,如果一致則會返回304,繼續使用緩存;如果不一致,則會重新請求,返回200。
二、伺服器緩存
上面是一個簡單的流程圖:
用戶1訪問A頁面,伺服器解析A頁面返回給用戶1,同時在伺服器內存上做一定映射,把A頁面緩存在硬碟上面
用戶2訪問A頁面,伺服器直接根據內存上的映射找到對應的頁面緩存,直接返回給用戶2,這樣就減少了伺服器對同一頁面的重復解析
伺服器緩存和瀏覽器緩存的區別:
伺服器緩存是把頁面緩存到伺服器上的硬碟里,而瀏覽器緩存是把頁面緩存到用戶自己的電腦里
Nginx伺服器
Nginx是一個高性能的HTTP和反向代理伺服器。具有非常多的優越性:
在連接高並發的情況下,Nginx是Apache伺服器不錯的替代品,Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平台之一。
Nginx提供了expires、etag、if-modified-since指令來實現瀏覽器緩存控制。
nginx -s reload#重新載入配置文件
nginx -s reopen#重新打開log文件
nginx -s stop#快速關閉nginx服務
nginx -s quit #優雅的關閉nginx服務,等待工作進程處理完所有的請求
Nginx設置靜態文件的緩存過期時間
location ~.*\.(js|css|html|png|jpg)$ {
expires 3d;
}
expires 3d;//表示緩存3天
expires 3h;//表示緩存3小時
expires max;//表示緩存10年
expires -1;//表示永遠過期。
如果設置為-1在js、css等靜態文件在沒有修改的情況下返回的是http 304,如果修改返回http 200
對於靜態資源會自動添加ETag,可以通過添加etag off指令禁止生成ETag。如果是靜態文件,那麼Last-Modified值為文件的最後修改時間。
在開發調試web的時候,經常會碰到因瀏覽器緩存(cache)而經常要去清空緩存或者強制刷新來測試的煩惱,提供下apache不緩存配置和nginx不緩存配置的設置。在常用的緩存設置裡面有兩種方式,都是使用add_header來設置:分別為Cache-Control和Pragma。
location ~ .*\.(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
add_header Pragma no-cache;
}
nginx gzip壓縮
使用 gzip 壓縮可以降低網站帶寬消耗,同時提升訪問速度。
主要在nginx服務端將頁面進行壓縮,然後在瀏覽器端進行解壓和解析,
目前大多數流行的瀏覽器都遲滯gzip格式的壓縮,所以不用擔心。
默認情況下,Nginx的gzip壓縮是關閉的,同時,Nginx默認只對text/html進行壓縮
gzip on;
ersio #開啟gzip壓縮輸出
gzip_http_vn 1.0 ;#默認1.1
#其中的gzip_http_version的設置,它的默認值是1.1,就是說對HTTP/1.1協議的請求才會進行gzip壓縮
#如果我們使用了proxy_pass進行反向代理,那麼nginx和後端的upstream server之間是用HTTP/1.0協議通信的。
gzip_vary on ;
#和http頭有關系,加個vary頭,給代理伺服器用的,有的瀏覽器支持壓縮,有的不支持,
#所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
gzip_comp_level 6;
#設置gzip壓縮等級,等級越底壓縮速度越快文件壓縮比越小,反之速度越慢文件壓縮比越大 1-9
gzip_proxied any;
#Ngnix作為反向代理的時候啟用
#expample:gzip_proxied no-cache;
# off – 關閉所有的代理結果數據壓縮
# expired – 啟用壓縮,如果header中包含」Expires」頭信息
# no-cache – 啟用壓縮,如果header中包含」Cache-Control:no-cache」頭信息
# no-store – 啟用壓縮,如果header中包含」Cache-Control:no-store」頭信息
# private – 啟用壓縮,如果header中包含」Cache-Control:private」頭信息
# no_last_modified – 啟用壓縮,如果header中包含」Last_Modified」頭信息
# no_etag – 啟用壓縮,如果header中包含「ETag」頭信息
# auth – 啟用壓縮,如果header中包含「Authorization」頭信息
# any – 無條件壓縮所有結果數據
gzip_types text/html ;#壓縮的文件類型
#設置需要壓縮的MIME類型,非設置值不進行壓縮
#param:text/html|application/x-javascript|text/css|application/xml
gzip_buffers 16 8k; #設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間
#設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間
# param1:int 增加的倍數
# param2:int(k) 後面單位是k
# example: gzip_buffers 4 8k;
# Disable gzip for certain browsers.
gzip_disable 「MSIE [1-6].(?!.*SV1)」; #ie6不支持gzip,需要禁用掉ie6
『拾』 Nginx開啟和配置Gzip壓縮
nginx 是一個高性能的 Web 伺服器,合理配置nginx可以有效提高網站的響應速度。
本文介紹 nginx 的 gzip 和緩存開啟配置。
gzip的壓縮頁面需要瀏覽器和伺服器雙方都支持,實際上就是伺服器端壓縮,傳到瀏覽器後瀏覽器解壓並解析。
Nginx的壓縮輸出有一組gzip壓縮指令來實現。
相關指令位於 http{…} 兩個大括弧之間。
<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin-top: 0px; margin-bottom: 1rem; overflow: auto; display: block; color: rgb(33, 37, 41); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"># 開啟gzip
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6].";</pre>
關於具體的參數說明可以參考 nginx 的文檔 。
<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin-top: 0px; margin-bottom: 1rem; overflow: auto; display: block; color: rgb(33, 37, 41); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">location ~* ^.+.(ico|gif|jpg|jpeg|png)$ {
access_log off;
expires 30d;
}
location ~* ^.+.(css|js|txt|xml|swf|wav)$ {
access_log off;
expires 24h;
}
location ~* ^.+.(html|htm)$ {
expires 1h;
}</pre>
其中的緩存時間可以自己根據需要修改。