nginx+redis 實現 jsp頁面緩存,提升系統吞吐率

er74 9年前發布 | 36K 次閱讀 Redis Web服務器

 

最近在開發的時候,發現之前APP客戶端的一部分頁面用的是webview交互,這些頁面請求很多,打開一套試卷,將會產生100+的請求量,導 致系統性能下降。于是考慮在最靠近客戶端的Nginx服務器上做Redis緩存。綜合了下網上對于php緩存的資料,經過一番改動,終于搭建成功。由于網 上的是針對php的,而且沒有說明,對于我這種完全不動運維的人來說,研究下來還是挺痛苦的。所以整理一份比較完整的,供大家參考。

以下的配置中,可能有不適合或者寫的有問題的。請留言指出,謝謝!

最終緩存以后,整個項目結構圖如下(圖片復制的,請自動腦補充memcache為redis,php為tomcat):

nginx+redis 實現 jsp頁面緩存,提升系統吞吐率

參考文章地址:

1.srcache_nginx+redis構建緩存系統 http://www.ttlsa.com/nginx/construction-of-srcache_nginx_redis-caching-system/

2.httpsrcachemodule wiki  http://wiki.nginx.org/HttpSRCacheModule#srcache_response_cache_control

1. 安裝Nginx

首先下載 Nginx安裝包 ,tar zvxf解壓到/usr/local/src目錄;

下載模塊 ngx_devel_kit , set-misk-nginx-module , srcache-nginx-module , echo-nginx-module , ngx-http-redis , redis2-nginx-module ;

將這些模塊解壓到/usr/local/src/modules/下面;

進入/usr/local/src/nginx-1.8.0/目錄,執行如下命令:

./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/目錄中,至此安裝成功;

2. 配置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;
}

到這里后,配置就完成了。

3. 運行效果

沒有做緩存狀態:

nginx+redis 實現 jsp頁面緩存,提升系統吞吐率

有做緩存狀態:

nginx+redis 實現 jsp頁面緩存,提升系統吞吐率

響應頭信息

第一次請求:

nginx+redis 實現 jsp頁面緩存,提升系統吞吐率

再次請求:

nginx+redis 實現 jsp頁面緩存,提升系統吞吐率

運行效果明顯的是X-cached-from這個頭信息的變化。

4. 未解決的問題

不明白用了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,依然不好使。無奈只好按照文檔上的來了。

 

 本文由用戶 er74 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!