nginx+memcache实现页面缓存应用
一.前言
nginx的memcached_module模塊可以直接從memcached服務(wù)器中讀取內(nèi)容后輸出,后續(xù)的請求不再經(jīng)過應(yīng)用程序處理,如php-fpm、django,大大的提升動態(tài)頁面的速度。nginx只負(fù)責(zé)從memcached服務(wù)器中讀取數(shù)據(jù),要往memcached寫入數(shù)據(jù)還得需要后臺的應(yīng)用程序來完成,主動的將要緩存的頁面緩存到memcached中,可以通過404重定向到后端去處理的。?
ngx_http_memcached_module可以操作任何兼用memcached協(xié)議的軟件。如ttserver、membase等。
?
結(jié)構(gòu)圖如下:
?
memcached的key可以通過memcached_key變量來設(shè)置,如以$uri。如果命中,那么直接輸出內(nèi)容,沒有命中就意味著nginx需要從應(yīng)用程序請求頁面。同時(shí),我們還希望該應(yīng)用程序?qū)㈡I值對寫入到memcached,以便下一個(gè)請求可以直接從memcached獲取。
如果鍵值不存在,nginx將報(bào)告not found錯誤。最好的方法是使用error_page指定和location請求處理。同時(shí)包含"Bad Gateway"錯誤和"Gateway Timeout"錯誤,如:error_page 404 502 504 = @app ;。
注意:需要設(shè)置default_type,否則可能會顯示不正常。
?
2. 模塊指令說明:
memcached_bind?
語法: memcached_bind address | off;?
默認(rèn)值: none?
配置段: http, server, location?
指定從哪個(gè)IP來連接memcached服務(wù)器
?
memcached_buffer_size
語法: memcached_buffer_size size;
默認(rèn)值: 4k|8k;
配置段: http, server, location
讀取從memcached服務(wù)器接收到響應(yīng)的緩沖大小。盡快的將響應(yīng)同步傳給客戶端。
memcached_connect_timeout
語法:memcached_connect_timeout time;
默認(rèn)值:60s;
配置段:http, server, location
與memcached服務(wù)器建立連接的超時(shí)時(shí)間。通常不超過75s。
memcached_gzip_flag
語法:memcached_gzip_flag flag;
默認(rèn)值:none
配置段:http, server, location
測試memcached服務(wù)器響應(yīng)標(biāo)志。如果設(shè)置了,將在響應(yīng)頭部添加了Content-Encoding:gzip。
memcached_next_upstream
語法: memcached_next_upstream error | timeout | invalid_response | not_found | off ...;
默認(rèn)值: error timeout;
配置段: http, server, location
指定在哪些狀態(tài)下請求將轉(zhuǎn)發(fā)到另外的負(fù)載均衡服務(wù)器上,僅當(dāng)memcached_pass有兩個(gè)或兩個(gè)以上時(shí)使用。
memcached_pass
語法:memcached_pass address:port or socket;
默認(rèn)值:none
配置段:location, if in location
指定memcached服務(wù)器地址。使用變量$memcached_key為key查詢值,如果沒有相應(yīng)的值則返回error_page 404。
memcached_read_timeout
語法:memcached_read_timeout time;
默認(rèn)值:60s;
配置段:http, server, location
定義從memcached服務(wù)器讀取響應(yīng)超時(shí)時(shí)間。
memcached_send_timeout
語法:memcached_send_timeout
默認(rèn)值:60s
配置段:http, server, location
設(shè)置發(fā)送請求到memcached服務(wù)器的超時(shí)時(shí)間。
$memcached_key變量:
memcached key的值。
?
3. nginx memcached的增強(qiáng)版ngx_http_enhanced_memcached_module
基于nginx memcached 模塊的,添加的新特性有:?
1. 自定義HTTP頭,如Content-Type, Last-Modified。?
2. hash鍵可超過250個(gè)字符,memcached受限。?
3. 通過HTTP請求將數(shù)據(jù)存儲到memcached。?
4. 通過HTTP請求從memcached刪除數(shù)據(jù)。?
5. 通過HTTP請求清除所有memcached緩存數(shù)據(jù)。?
6. 通過HTTP請求獲取memcached狀態(tài)數(shù)據(jù)。?
7. 鍵名空間管理,來部分刷新緩存。?
8. 緩存通過If-Modified-Since頭和內(nèi)容Last-Modified來回復(fù)304Not Modified請求。
?
?
4. 應(yīng)用實(shí)例
nginx配置實(shí)例:
?
upstream memcacheds {server 10.1.240.166:22222; } server {listen 8080;server_name nm.ttlsa.com;index index.html index.htm index.php;root /data/wwwroot/test.ttlsa.com/webroot;location /images/ {set $memcached_key $request_uri;add_header X-mem-key $memcached_key;memcached_pass memcacheds;default_type text/html;error_page 404 502 504 = @app;}location @app {rewrite ^/.* /nm_ttlsa.php?key=$request_uri;}location ~ .*\.php?${include fastcgi_params;fastcgi_pass 127.0.0.1:10081;fastcgi_index index.php;fastcgi_connect_timeout 60;fastcgi_send_timeout 180;fastcgi_read_timeout 180;fastcgi_buffer_size 128k;fastcgi_buffers 4 256k;fastcgi_busy_buffers_size 256k;fastcgi_temp_file_write_size 256k;fastcgi_intercept_errors on;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;} }nm_ttlsa.php實(shí)例:
addServers($servers);$r=$m->set($_GET['key'],$data); header('Content-Length: '.filesize($fn)."\r\n");header('Content-Type: image/gif'."\r\n");header('X-cache: MISS'."\r\n");print $data; }else{header('Location: http://www.ttlsa.com'."\r\n"); }?
5. 測試
第一次訪問:(需要經(jīng)過php處理)
?
再次訪問:(直接從memcached讀取)
哈,這個(gè)實(shí)例并不好。
1. 地球人都知道m(xù)emcached不是持久化的,如果是永久性的圖片應(yīng)用,選用可以持久化存儲方案合適,如riak、membase、ttserver、mongodb GridFS等等。
2. 如果是用戶頭像的應(yīng)用,用memcached來做緩存也不合適。因?yàn)橛脩舾念^像又得刷新緩存,鑒于此,一步到位的用ttserver或mongodb GridFS來做用戶頭像的存儲豈不是更好么。
ttserver+nginx構(gòu)建高并發(fā)高可用性應(yīng)用參見:http://www.ttlsa.com/html/1429.html
這個(gè)實(shí)例改改或許可以用來在線遷移圖片到key-value存儲的過渡方案。
轉(zhuǎn)載于:https://www.cnblogs.com/lpfuture/p/5800042.html
總結(jié)
以上是生活随笔為你收集整理的nginx+memcache实现页面缓存应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。