nginx+memcache實現頁面緩存應用


一.前言

nginx的memcached_module模塊可以直接從memcached服務器中讀取內容后輸出,后續的請求不再經過應用程序處理,如php-fpm、django,大大的提升動態頁面的速度。nginx只負責從memcached服務器中讀取數據,要往memcached寫入數據還得需要后台的應用程序來完成,主動的將要緩存的頁面緩存到memcached中,可以通過404重定向到后端去處理的。 
ngx_http_memcached_module可以操作任何兼用memcached協議的軟件。如ttserver、membase等。

 

結構圖如下:

 

memcached的key可以通過memcached_key變量來設置,如以$uri。如果命中,那么直接輸出內容,沒有命中就意味着nginx需要從應用程序請求頁面。同時,我們還希望該應用程序將鍵值對寫入到memcached,以便下一個請求可以直接從memcached獲取。
如果鍵值不存在,nginx將報告not found錯誤。最好的方法是使用error_page指定和location請求處理。同時包含"Bad Gateway"錯誤和"Gateway Timeout"錯誤,如:error_page 404 502 504 = @app ;。
注意:需要設置default_type,否則可能會顯示不正常。

 

2. 模塊指令說明:

memcached_bind 
語法: memcached_bind address | off; 
默認值: none 
配置段: http, server, location 
指定從哪個IP來連接memcached服務器

 

memcached_buffer_size
語法: memcached_buffer_size size;
默認值: 4k|8k;
配置段: http, server, location
讀取從memcached服務器接收到響應的緩沖大小。盡快的將響應同步傳給客戶端。

memcached_connect_timeout
語法:memcached_connect_timeout time;
默認值:60s;
配置段:http, server, location
與memcached服務器建立連接的超時時間。通常不超過75s。

memcached_gzip_flag
語法:memcached_gzip_flag flag;
默認值:none
配置段:http, server, location
測試memcached服務器響應標志。如果設置了,將在響應頭部添加了Content-Encoding:gzip。

memcached_next_upstream
語法: memcached_next_upstream error | timeout | invalid_response | not_found | off ...;
默認值: error timeout;
配置段: http, server, location
指定在哪些狀態下請求將轉發到另外的負載均衡服務器上,僅當memcached_pass有兩個或兩個以上時使用。

memcached_pass
語法:memcached_pass address:port or socket;
默認值:none
配置段:location, if in location
指定memcached服務器地址。使用變量$memcached_key為key查詢值,如果沒有相應的值則返回error_page 404。

memcached_read_timeout
語法:memcached_read_timeout time;
默認值:60s;
配置段:http, server, location
定義從memcached服務器讀取響應超時時間。

memcached_send_timeout
語法:memcached_send_timeout
默認值:60s
配置段:http, server, location
設置發送請求到memcached服務器的超時時間。

$memcached_key變量:
memcached key的值。

 

3. nginx memcached的增強版ngx_http_enhanced_memcached_module

基於nginx memcached 模塊的,添加的新特性有: 
1. 自定義HTTP頭,如Content-Type, Last-Modified。 
2. hash鍵可超過250個字符,memcached受限。 
3. 通過HTTP請求將數據存儲到memcached。 
4. 通過HTTP請求從memcached刪除數據。 
5. 通過HTTP請求清除所有memcached緩存數據。 
6. 通過HTTP請求獲取memcached狀態數據。 
7. 鍵名空間管理,來部分刷新緩存。 
8. 緩存通過If-Modified-Since頭和內容Last-Modified來回復304Not Modified請求。

 

 

4. 應用實例

nginx配置實例:

 

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實例:

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. 測試

第一次訪問:(需要經過php處理)

 

再次訪問:(直接從memcached讀取)

哈,這個實例並不好。
1. 地球人都知道memcached不是持久化的,如果是永久性的圖片應用,選用可以持久化存儲方案合適,如riak、membase、ttserver、mongodb GridFS等等。
2. 如果是用戶頭像的應用,用memcached來做緩存也不合適。因為用戶更改頭像又得刷新緩存,鑒於此,一步到位的用ttserver或mongodb GridFS來做用戶頭像的存儲豈不是更好么。
ttserver+nginx構建高並發高可用性應用參見:http://www.ttlsa.com/html/1429.html
這個實例改改或許可以用來在線遷移圖片到key-value存儲的過渡方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM