最近在開發的時候,發現以前APP客戶端的一部分頁面用的是webview交互,這些頁面請求不少,打開一套試卷,將會產生100+的請求量,致使系統性能降低。因而考慮在最靠近客戶端的Nginx服務器上作Redis緩存。綜合了下網上對於php緩存的資料,通過一番改動,終於搭建成功。因爲網上的是針對php的,並且沒有說明,對於我這種徹底不動運維的人來講,研究下來仍是挺痛苦的。因此整理一份比較完整的,供你們參考。php
如下的配置中,可能有不適合或者寫的有問題的。請留言指出,謝謝!html
最終緩存之後,整個項目結構圖以下(圖片複製的,請自動腦補充memcache爲redis,php爲tomcat):nginx
參考文章地址:git
1.srcache_nginx+redis構建緩存系統 http://www.ttlsa.com/nginx/construction-of-srcache_nginx_redis-caching-system/github
2.httpsrcachemodule wiki http://wiki.nginx.org/HttpSRCacheModule#srcache_response_cache_controlweb
首先下載Nginx安裝包,tar zvxf解壓到/usr/local/src目錄;redis
下載模塊ngx_devel_kit, set-misk-nginx-module, srcache-nginx-module, echo-nginx-module, ngx-http-redis, redis2-nginx-module;apache
將這些模塊解壓到/usr/local/src/modules/下面;緩存
進入/usr/local/src/nginx-1.8.0/目錄,執行以下命令:tomcat
./configure --add-module=../modules/echo-nginx-module-0.57 --add-module=../modules/ngx_http_redis-0.3.7 --add-module=../modules/ngx_devel_kit-0.2.19 --add-module=../modules/set-misc-nginx-module-0.29 --add-module=../modules/srcache-nginx-module-master --add-module=../modules/redis2-nginx-module-master
而後執行make;make install;
默認安裝到/usr/local/nginx/目錄中,至此安裝成功;
首先在Http體中聲明upstream(這個命令沒有研究,只能本身猜想了下),代碼以下:
upstream redis{ server 127.0.0.1:6379; keepalive 512; }
server 是Redis服務器的IP+PORT,keepalive是保持的鏈接數,這個鏈接數是網上的,對於個人項目來講應該是太大了。你們自行修改。
配置Server中的location監聽
location /test/ { #這三個命令參考srcache 文檔,http://wiki.nginx.org/HttpSRCacheModule srcache_store_private on; srcache_methods GET; srcache_response_cache_control off; #匹配本身的路徑,因爲Nginx不支持嵌套if,因此這麼寫 if ($uri ~ /test/index\.jsp$){ set $flag "${flag}1"; } if ($arg_id ~ [0-9]+$){ set $flag "${flag}1"; } if ($flag = "011"){ #這裏我用普通的請求參數來做爲緩存的鍵值,網上的是用MD5,可是對於更新緩存又多了操做。你們根據業務自行調整。 set $key $arg_id; set_escape_uri $escaped_key $key; #請求過來會先查詢這個 srcache_fetch GET /redis $key; #過時時間 srcache_default_expire 60; srcache_store PUT /redis2 key=$escaped_key&exptime=$srcache_expire; #添加頭信息 add_header X-Cached-From $srcache_fetch_status; add_header X-Cached-Store $srcache_store_status; add_header X-Key $key; set_md5 $md5key $key; add_header X-md5-key $md5key; add_header X-Query_String $query_string; add_header X-expire $srcache_expire; } #網上都是用fast_cgi來代理,沒弄會,就用最初的了,貌似fast_cgi是apache php下用的 proxy_pass http://192.168.1.102:8080; } #redis模塊 location = /redis { internal; set $redis_key $args; redis_pass redis; } #redis2模塊 location = /redis2 { internal; set_unescape_uri $exptime $arg_exptime; set_unescape_uri $key $arg_key; redis2_query set $key $echo_request_body; redis2_query expire $key $exptime; redis2_pass redis; }
到這裏後,配置就完成了。
響應頭信息
運行效果明顯的是X-cached-from這個頭信息的變化。
不明白用了httpredis2爲何還要引入httpredis,查詢文檔後的結果是說redis2是httpredis升級版,可是wiki上說:
Also, you need both HttpRedisModule and HttpRedis2Module. The former is used in the srcache_fetch subrequest and the latter is used in the srcache_store subrequest.
也就是說兩個都要。
另外就是對於/redis這個location裏,沒有redis get這樣的代碼,是怎麼獲取到返回信息的。最初本身只安裝httpredsi2,用redis2_pass redis很差使。而後加入redis2_query get $redis_key,依然很差使。無奈只好按照文檔上的來了。
有比較熟悉這個的大俠請留言指出,好在部署線上環境前進行優化!!謝謝!!
http://www.cnblogs.com/luochengqiuse/p/4677027.html