nginx+redis 实现 jsp页面缓存,提升系统吞吐率
最近在开发的时候,发现之前APP客户端的一部分页面用的是webview交互,这些页面请求很多,打开一套试卷,将会产生100+的请求量,导致系统性能下降。于是考虑在最靠近客户端的Nginx服务器上做Redis缓存。综合了下网上对于php缓存的资料,经过一番改动,终于搭建成功。由于网上的是针对php的,而且没有说明,对于我这种完全不动运维的人来说,研究下来还是挺痛苦的。所以整理一份比较完整的,供大家参考。
以下的配置中,可能有不适合或者写的有问题的。请留言指出,谢谢!
最终缓存以后,整个项目结构图如下(图片复制的,请自动脑补充memcache为redis,php为tomcat):
参考文章地址:
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. 运行效果
没有做缓存状态:
有做缓存状态:
响应头信息
第一次请求:
再次请求:
运行效果明显的是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,依然不好使。无奈只好按照文档上的来了。
有比较熟悉这个的大侠请留言指出,好在部署线上环境前进行优化!!谢谢!!
http://www.cnblogs.com/luochengqiuse/p/4677027.html
最新文章
- STSDB、NDataBase 对象数据库在不同.net framework下无法读取的解决办法
- springmvc 上传下载
- 6. support vector machine
- Java数据结构和算法之哈希表
- 温故知新---重读C#InDepth(一)
- 关于arraylist.remove的一些小问题。
- php 常用几个函数
- 用keil怎么像makefile那样选择哪些文件进行编译?
- 理想非常丰满,现实非常骨感——致WiFi通话
- IP核之初——FIFO添加以太网MAC头部
- 【Linux基础】Unix与Linux操作系统介绍
- Unity 代码组件获取和使用、Resources加载、OnGUI、Time、Mathf、PlayerPref
- Vc数据库编程基础MySql数据库的常见库命令.跟表操作命令
- 开源项目filepond的独立自由之路:城市套路深
- 前端框架framework和库library的一点区别和记录
- post方式发送请求报文
- 一篇关于介绍php的几个user 认证相关的几个包
- mysql左外连接
- Artech的MVC4框架学习——第一章初步认识ASP.NET MVC
- 【Java】java运行jar时,报 java.lang.UnsupportedClassVersionError
热门文章
- Window10安装TestLink,以及登录mysql数据库的错误处理
- 获取ActiveX控件本身所在的路径 和 error PRJ0050
- JIRA官方:JIRA亮点介绍
- linux之SQL语句简明教程---HAVING
- Hadoop 6、第一个mapreduce程序 WordCount
- 安装android studio时,解决unable to access android sdk add-on list
- .NET领域驱动设计—初尝(三:穿过迷雾走向光明)
- Linux多线程编程小结
- 【递推】【HDU2585】【hotel】
- C#整理2——C#的输入输出及基本类型