最近在开发的时候,发现之前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

nginx+redis 实现 jsp页面缓存,提升系统吞吐率的更多相关文章

  1. JSP 页面缓存以及清除缓存

    一.概述 缓存的思想可以应用在软件分层的各个层面.它是一种内部机制,对外界而言,是不可感知的. 数据库本身有缓存,持久层也可以缓存.(比如:hibernate,还分1级和2级缓存) 业务层也可以有缓存 ...

  2. jsp页面动态获取系统时间

    最近在做练习时碰到了这样一个问题:"读者选择查询图书相应信息,跳转到书目的详细信息界面,当可借阅数量大于零,点击借阅按钮,提示用户借阅成功,并显示归还日期(三个月),否则提示用户该书可借阅数 ...

  3. jsp页面缓存清理

    jsp页面开发过程中,页面修改了,但是显示的还是以前的页面,没有显示刚修改的内容,清理缓存方法,加上头信息: <meta http-equiv="pragma" conten ...

  4. Nginx设置expires设定页面缓存时间 不缓存或一直使用缓存

    配置expires expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求 要配置expires,可以在http段中或者server段中或者location段中加入 l ...

  5. jsp页面获取当前系统时间

    value="<% out.print(new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(n ...

  6. Nginx特性验证-反向代理/负载均衡/页面缓存/URL重定向

    原文发表于cu:2016-08-25 参考文档: Nginx 反向代理.负载均衡.页面缓存.URL重写等:http://freeloda.blog.51cto.com/2033581/1288553 ...

  7. jsp页面禁用缓存

    问题:为什么禁用JSP页面缓存 就是为了得到实时信息 怎样禁用JSP页面缓存 1.在JSP页面设置 <meta http-equiv="pragma" content=&qu ...

  8. SP 页面缓存以及清除缓存

    JSP 页面缓存以及清除缓存 一.概述 缓存的思想可以应用在软件分层的各个层面.它是一种内部机制,对外界而言,是不可感知的. 数据库本身有缓存,持久层也可以缓存.(比如:hibernate,还分1级和 ...

  9. JSP页面中的指令标识

    JSP页面中的指令标识 制作人:全心全意 指令标识主要用于设定整个JSP页面范围内都有效的相关信息,它是被服务器解释并执行的,不会产生任何内容输出到网页中.也就是说,指令标识对于客户端浏览器是不可见的 ...

随机推荐

  1. Android反编译APK

    http://blog.csdn.net/vipzjyno1/article/details/21039349/ 关于被加壳工具添加我的apk如何脱壳 http://www.blogfshare.co ...

  2. ListView的小知识

    1.设置项目分割功能 android:divider="@android:color/blue" android:dividerHeight="10dp" &l ...

  3. WndProc Message消息解释

    public class WindowsMessage { public const int WM_NULL = 0x0000; // public const int WM_CREATE = 0x0 ...

  4. C++ 包含头文件 和 宏的使用 和 条件编译

    1 #define命令剖析 1.1   #define的概念     #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. ...

  5. Sql Server专题:SQL 经典实例

    SQL 经典实例 1.实例表: Student(S#,Sname,Sage,Ssex) 学生表 S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname ...

  6. 好久没来了,重出江湖,共享个python34+pyqt+pyserial串口工具源码

    真的是好久没来了,写博客对我来说还真是难坚持下来,热度一过就忘了,就算什么时候想起来也懒得去敲一个字,这次真不知道能坚持多久,随心吧,想写写,不想写也不勉强自己. 最近由于工作调试需要自己写了一个带图 ...

  7. IIS给网站地址配置成HTTPS的

    2.增加网站绑定 3.如果https的URL访问不了,可能是443端口被占用 然后netstat -anono

  8. 电子科大POJ "孤单整数"

    孤单整数 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) C-sources: ...

  9. API经济产业

    技术大咖为我们铺好了前进道路,我们为什么还要敬而远之舍近索远呢?充分利用开源,利用API进行App有效整合. 为应用添加日志功能,Loggly; 为应用添加用户管理和身份认证模块,Stormpath; ...

  10. linux底半部机制在视频采集驱动中的应用

    最近在做一个arm+linux平台的视频驱动.本来这个驱动应该是做板子的第三方提供的,结果对方软件实力很差,自己做不了这个东西,外包给了一个暑期兼职的在读博士.学生嘛,只做过实验,没做过产品,给出的东 ...