memc_nginx+srcache_nginx+memcached构建透明的动态页面缓存
生活随笔
收集整理的這篇文章主要介紹了
memc_nginx+srcache_nginx+memcached构建透明的动态页面缓存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
在上一節《 nginx+memcached構建頁面緩存應用》 http://www.ttlsa.com/html/2418.html中,說道nginx只負責從memcached服務器中讀取數據,要往memcached寫入數據還得需要后臺的應用程序來完成。使用memc-nginx和srcache-nginx模塊就可以主動的向memcached添加緩存,對應用程序來說是透明的。大大的提高動態頁面訪問速度。第一次訪問創建緩存,后續訪問在緩存過期時間內,直接從memcached返回,不需要再次經過php-fpm處理。 nginx_memc模塊與nginx_srcache模塊配合使用,來提供緩存服務器后端的操作,在技術上,任何提供REST接口的模塊都可以與nginx_srcache配合使用來獲取和存儲緩存子請求。 使用memcached作為后端緩存,需要注意memcached存儲大小的限制,不得超過1M。為了使用更寬松的后端存儲服務,建議使用redis等,參見《 srcache_nginx+redis構建緩存系統》。 1. memc-nginx-module模塊指令說明: memc_pass 語法:memc_pass address:port or socket; 默認值:none 配置段:http, server, location, if 指定memcached服務器地址。 memc_cmds_allowed 語法:memc_cmds_allowed <cmd>... 默認值: none 配置段:http, server, location, if 列出允許訪問的memcached命令。默認情況下,所有的memcached命令都可以訪問。 memc_flags_to_last_modified 語法:memc_flags_to_last_modified on|off 默認值:off 配置段:http, server, location, if 讀取memcached標識,并將其設置為Last-Modified頭部值。對于有條件的get,nginx返回304未修改響應,以便節省帶寬。 memc_connect_timeout 語法:memc_connect_timeout <time> 默認值:60s 配置段: http, server, location 與memcached服務器建立連接的超時時間。不得超過597 hours。 memc_send_timeout 語法:memc_send_timeout <time> 默認值:60s 配置段:http, server, location 設置發送請求到memcached服務器的超時時間。不得超過597 hours。 memc_read_timeout 語法:memc_read_timeout <time> 默認值:60s 配置段:http, server, location 定義從memcached服務器讀取響應超時時間。不得超過597 hours。 memc_buffer_size 語法:memc_buffer_size <size> 默認值:4k/8k 配置段:http, server, location 讀取從memcached服務器接收到響應的緩沖大小。 2. memcached支持的命令 memcached存儲命令set、add、replace、prepend、append,以$memc_key作為鍵。$memc_exptime定義過期時間,默認值為0。$memc_flags作為標識,默認值為0,來建立相應的memcached查詢。 如果$memc_value沒有定義,那么請求的請求體將作為該值,除了incr和decr命令外。注意:如果$memc_value定義為空的字符串,那么該空字符串仍然被當做該值。 2.1 get $memc_key 使用鍵來檢索值。 location /foo { set $memc_cmd 'get'; set $memc_key 'my_key'; memc_pass 127.0.0.1:11211; add_header X-Memc-Flags $memc_flags; } 如果該鍵被找到,響應體為該鍵值,返回200。否則范圍404 Not Found。如果發生錯誤或客戶端錯誤或服務端錯誤,則返回502。標識碼設置到$memc_flags變量。通常使用add_header指令來添加到響應頭部。 2.2 set $memc_key $memc_flags $memc_exptime $memc_value 將請求體作為memcached值。如果另外指定值可以通過$memc_value變量來指定。 location /foo {set $memc_cmd 'set';set $memc_key 'my_key';set $memc_flags 12345;set $memc_exptime 24;memc_pass 127.0.0.1:11211; } 或 location /foo {set $memc_cmd 'set';set $memc_key 'my_key';set $memc_flags 12345;set $memc_exptime 24;set $memc_value 'my_value';memc_pass 127.0.0.1:11211; } 返回201,說明創建memcached緩存存儲成功。返回200說明NOT_STORED。返回404說明NOT_FOUND。返回502說明發生錯誤或客戶端錯誤或服務端錯誤。 memcached原始響應是響應體,404 NOT FOUND除外。 2.3 add $memc_key $memc_flags $memc_exptime $memc_value 和set命令相似 2.4 prepend $memc_key $memc_flags $memc_exptime $memc_value 和set命令相似 2.5 delete $memc_key 刪除該鍵值 location /foo set $memc_cmd delete; set $memc_key my_key;memc_pass 127.0.0.1:11211; } 返回200說明刪除成功。返回404說明NOT_FOUND。返回502說明發生錯誤或客戶端錯誤或服務端錯誤。 2.6 delete $memc_key $memc_exptime 和delete命令相似。 2.7 incr $memc_key $memc_value 給指定的$memc_key對應的$memc_value增量。 location /foo { set $memc_key my_key; set $memc_value 2; memc_pass 127.0.0.1:11211; } 每次訪問/foo將導致my_key的值加2。 返回200說明成功。返回404說明鍵Not Found。返回502說明發生錯誤或客戶端錯誤或服務端錯誤。 2.8 decr $memc_key $memc_value 與incr相似。 2.9 flush_all 刷新memcached上所有的鍵。 location /foo { set $memc_cmd flush_all; memc_pass 127.0.0.1:11211; } 2.10 flush_all $memc_exptime 與flush_all相似。 2.11 stats 輸出memcached統計信息。 location /foo { set $memc_cmd stats; memc_pass 127.0.0.1:11211; } 2.12 version 返回memcached版本信息。 location /foo { set $memc_cmd version; memc_pass 127.0.0.1:11211; } 3. srcache-nginx-module模塊指令說明: srcache_fetch 語法:srcache_fetch <method> <uri> <args>? 默認值:no 配置段:http, server, location, location if 查詢緩存。返回200說明緩存命中,直接從緩存響應客戶端請求。非200需要后端程序處理。 srcache_fetch_skip 語法:srcache_fetch_skip <flag> 默認值:srcache_fetch_skip 0 配置段:http, server, location, location if <flag>支持nginx變量。當這個參數值不為空和不等于0,則從緩存取數據過程被無條件跳過。 srcache_store 語法:srcache_store <method> <uri> <args>? 默認值:no 配置段:http, server, location, location if 將當前請求的響應存入緩存。可以使用srcache_store_skip和srcache_store_max_size指令禁用緩存。不管是響應狀態行,響應頭,響應體都會被緩存。默認情況下,下列特殊響應頭不會被緩存: Connection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgrade Set-Cookie 可以使用srcache_store_pass_header、srcache_store_hide_header指令來控制哪些頭要緩存哪些不要。 注意:即使所有的響應數據被立即發送,當前的nginx請求生命周期未必完成,直到srcache_store子請求完成。這意味著服務器端延遲關閉TCP連接,或下一個請求服務發送同一個TCP連接。 srcache_store_max_size 語法:srcache_store_max_size <size> 默認值:srcache_store_max_size 0 配置段:http, server, location, location if 當響應體超過該值,將不會緩存。 當后端緩存存儲有對緩存數據做硬限制,這個指令非常有用。比如memcached服務器,上限是1M。 默認值0,不限制。 srcache_store_skip 語法:srcache_store_skip <flag> 默認值:srcache_store_skip 0 配置段:http, server, location, location if <flag>支持nginx變量。當這個參數值不為空和不等于0,則從存入緩存過程被無條件跳過。 srcache_store_statuses 語法:srcache_store_statuses <status1> <status2> .. 默認值:srcache_store_statuses 200 301 302 配置段:http, server, location, location if 該指令控制那些狀態碼響應被緩存。 srcache_header_buffer_size 語法:srcache_header_buffer_size <size> 默認值:srcache_header_buffer_size 4k/8k 配置段:http, server, location, location if 在序列化響應頭時控制頭緩沖大小。默認大小為頁面大小,通常為4k或8k,取決于具體平臺。 注意:該大小是以每個頭的,因此,需要足夠大來容納最大響應頭。 srcache_store_hide_header 語法:srcache_store_hide_header <header> 默認值:no 配置段:http, server, location, location if 默認情況下,除了以下頭緩存所有響應頭: Connection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgrade Set-Cookie 可以隱藏多個響應頭,不區分大小寫。如 srcache_store_hide_header X-Foo; srcache_store_hide_header Last-Modified; srcache_store_pass_header 語法:srcache_store_pass_header <header> 默認值:no 配置段:http, server, location, location if 默認情況下,除了以下頭緩存所有響應頭: Connection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgrade Set-Cookie 可以緩存多個響應頭,不區分大小寫。如 srcache_store_pass_header Set-Cookie; srcache_store_pass_header Proxy-Autenticate; srcache_methods 語法:srcache_methods <method>... 默認值:srcache_methods GET HEAD 配置段:http, server, location srcache_ignore_content_encoding 語法:srcache_ignore_content_encoding on|off 默認值: srcache_ignore_content_encoding off 配置段:http, server, location, location if 內容是否編碼。 建議后端服務器禁用gzip/deflate壓縮。在nginx.conf配置: proxy_set_header Accept-Encoding ""; srcache_request_cache_control 語法:srcache_request_cache_control on|off 默認值:srcache_request_cache_control off 配置段:http, server, location 當該指令為on時,請求頭Cache-Control和Pragma按照下面的方法處理: 1. srcache_fetch查詢緩存操作時,當請求頭Cache-Control: no-cache 、 Pragma: no-cache 將跳過。 2. srcache_store存入緩存操作時,當請求頭Cache-Control: no-store將跳過。 當該指令為off時,將禁用此功能,對于繁忙的站點依賴緩存加速被認為是最安全的。 srcache_response_cache_control 語法:srcache_response_cache_control on|off 默認值:srcache_response_cache_control on 配置段:http, server, location 當該指令為on時,響應頭Cache-Control和Expires按照下面的方法處理: Cache-Control: private skips srcache_store, Cache-Control: no-store skips srcache_store, Cache-Control: no-cache skips srcache_store, Cache-Control: max-age=0 skips srcache_store, Expires: <date-no-more-recently-than-now> skips srcache_store. 該指令優先級比srcache_store_no_store,srcache_store_no_cache,srcache_store_private高。 srcache_store_no_store 語法:srcache_store_no_store on|off 默認值:srcache_store_no_store off 配置段:http, server, location 開啟該指令,將強制響應頭Cache-Control: no-store。默認為關閉。 srcache_store_no_cache 語法:srcache_store_no_cache on|off 默認值:srcache_store_no_cache off 配置段:http, server, location 開啟該指令,將強制響應頭Cache-Control: no-cache。默認為關閉。 srcache_store_private 語法:srcache_store_private on|off 默認值:srcache_store_private off 配置段:http, server, location 開啟該指令,將強制響應頭Cache-Control: private。默認為關閉。 srcache_default_expire 語法:srcache_default_expire <time> 默認值:srcache_default_expire 60s 配置段:http, server, location, location if 控制默認過期時間。當響應頭既沒有Cache-Control: max-age=N也沒有指定Expires時,允許的$srcache_expire變量值。 該值必須小于597hours。 srcache_max_expire 語法:srcache_max_expire <time> 默認值:srcache_max_expire 0 配置段:http, server, location, location if 控制最大緩存時間,此設置優先級高于其他計算方法。 該值必須小于597hours。 默認為0,不限制。 4. srcache-nginx-module變量 $srcache_expire 當前的響應存入緩存的過期時間。按照下面的方法計算: 1. 當響應頭Cache-Control: max-age=N被指定,那么N將作為過期時間。 2. 如果響應頭Expires被指定,那么該值與當前時間差作為過期時間。 3. 當既沒有指定Cache-Control: max-age=N也沒有指定Expires,那么使用 srcache_default_expire 指定的值。 如果超過srcache_max_expire指令值,那么此變量最終值為srcache_max_expire。 $srcache_fetch_status 獲取緩存的三種狀態值:HIT, MISS, BYPASS。 $srcache_store_status 存入緩存的兩種狀態值:STORE ,BYPASS。 5. 安裝nginx_memc和nginx_srcache模塊 # wget https://github.com/agentzh/memc-nginx-module/archive/master.zip # wget https://github.com/agentzh/srcache-nginx-module/archive/master.zip # ./configure --prefix=/usr/local/nginx-1.2.5 \ --add-module=../srcache-nginx-module --add-module=../memc-nginx-module # make # make install 6. 配置 upstream memcacheds {server 10.1.240.166:22222; } server {listen 8090;server_name test.ttlsa.com;index index.html index.htm index.php;root /data/wwwroot/www.ttlsa.com/webroot;location /memc {internal;memc_connect_timeout 100ms;memc_send_timeout 100ms;memc_read_timeout 100ms;set $memc_key $query_string;set $memc_exptime 120;memc_pass memcacheds;}location ~ .*\.php?${if ($uri ~ /ttlsa/){set $ttlsa_key $request_uri;srcache_fetch GET /memc $ttlsa_key;srcache_store PUT /memc $ttlsa_key;add_header X-Cached-From $srcache_fetch_status;add_header X-Cached-Store $srcache_store_status;}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;} } 7. 測試 7.1 第一次訪問(404 Not found 創建緩存) 7.2 后續訪問(直接從緩存中響應) 第一次訪問創建緩存,后續訪問在緩存過期時間內,直接從memcached返回,不需要再次經過php-fpm處理。大大提升動態頁面訪問速度。 《 memc_nginx+srcache_nginx+memcached遇到的問題》 如需轉載請注明出處:http://www.ttlsa.com/html/2460.html轉載于:https://my.oschina.net/766/blog/211446
總結
以上是生活随笔為你收集整理的memc_nginx+srcache_nginx+memcached构建透明的动态页面缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux挂载NTFS分区
- 下一篇: nginx向响应内容中追加内容(ngx_