利用memc-nginx-module模块缓存高并发页面
时间:2014-03-18 02:28 来源:linux.it.net.cn 作者:it
memc-nginx-module模块使用场景
针对一些访问量很大的页面,特别是瞬时访问量很大的系统,jetty无法支撑住请求,这时候可以使用memc-nginx-module模块模块与srcache-nginx-module模块将请求页面数据存放在
memcached中,可大大提升系统的并发能力。
memc-nginx-module模块安装
由于angentzh维护的openresty封装了所有这些模块,因此直接使用openresty是最方便的选择。
安装过程如下:
-
1.下载并解压ngx_openresty
wget "http://agentzh.org/misc/nginx/ngx_openresty-1.2.3.8.tar.gz"
tar -xvzf ngx_openresty-1.2.3.8.tar.gz
cd ngx_openresty-1.2.3.8
-
2.在configure之前,需要安装openresty依赖的库,安装如下:
yum install readline-devel pcre-devel openssl-devel
-
3.编译安装openresty,注意此处需要加上concat模块
./configure --add-module=/home/tar/nginx_concat_module/trunk/
make
make install
ngx_openresty默认安装在/usr/local/openresty目录下。
修改nginx.conf文件,配置memc-nginx-module模块
在http段,增加memc_server,并启用keepalive
upstream memc_server {
server 127.0.0.1:11211;
keepalive 512 ;
}
在server段,配置需要缓存的页面
location ~ ^/qiang/[0-9]*\.html$ {
set $qiang_key $request_uri;
srcache_fetch GET /memc $qiang_key;
srcache_store PUT /memc $qiang_key;
add_header X-Cached-From $srcache_fetch_status;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Accept-Encoding "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
location /memc {
internal;
memc_connect_timeout 100ms;
memc_send_timeout 100ms;
memc_read_timeout 100ms;
set $memc_key $query_string;
# 统一缓存5s
set $memc_exptime 30;
memc_pass memo_server;
}
说明
阅读上述Nginx缓存页面配置时,必需清楚nginx请求执行的顺利并不是只按照配置文件中指令所处的顺序。每一个指令都绑定在Ngnix请求执行顺序的一个阶段,上述配置的指令中,执行顺序大致如下:
srcache_fetch --> proxy_pass --> srcache_store
以上配置必须运行在srcache-nginx-module模块0.14及以上版本之上。
ngx_openresty-1.2.3.8对应的srcache-nginx-module版本为0.16
重启应用,验证
重启nginx,访问指定的URL,验证memc-nginx-module模块是否生效。验证方法如下:
上面配置文件中的
add_header X-Cached-From $srcache_fetch_status;
指令会将cache是否命中的状态输出成HTTP的一个扩展头信息里面,因此用Safari,Chrome,Firefox等浏览器查看http请求返回的数据就可以知道缓存是否命中。
$srcache_fetch_status 的取值有 “HIT”,“MISS”。
性能测试
对指定缓存进行压力测试,qps最高达到2300req/s,此时系统的cpu,内存等资源仍然很低,而千兆网卡则全部写满,瓶颈已不在cpu和内存上了,达到预期目标。
update(2012-10-29):
1、此方案中memcached与Nginx可放在同一台服务器上,必须两者间的数据交换过大导致网卡瓶颈
(责任编辑:IT)
memc-nginx-module模块使用场景
针对一些访问量很大的页面,特别是瞬时访问量很大的系统,jetty无法支撑住请求,这时候可以使用memc-nginx-module模块模块与srcache-nginx-module模块将请求页面数据存放在 memc-nginx-module模块安装
由于angentzh维护的openresty封装了所有这些模块,因此直接使用openresty是最方便的选择。
ngx_openresty默认安装在/usr/local/openresty目录下。 修改nginx.conf文件,配置memc-nginx-module模块在http段,增加memc_server,并启用keepaliveupstream memc_server { server 127.0.0.1:11211; keepalive 512 ; } 在server段,配置需要缓存的页面location ~ ^/qiang/[0-9]*\.html$ { set $qiang_key $request_uri; srcache_fetch GET /memc $qiang_key; srcache_store PUT /memc $qiang_key; add_header X-Cached-From $srcache_fetch_status; proxy_redirect off; proxy_set_header Host $host; proxy_set_header Accept-Encoding ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } location /memc { internal; memc_connect_timeout 100ms; memc_send_timeout 100ms; memc_read_timeout 100ms; set $memc_key $query_string; # 统一缓存5s set $memc_exptime 30; memc_pass memo_server; }
说明 srcache_fetch --> proxy_pass --> srcache_store
重启应用,验证
重启nginx,访问指定的URL,验证memc-nginx-module模块是否生效。验证方法如下: add_header X-Cached-From $srcache_fetch_status;
指令会将cache是否命中的状态输出成HTTP的一个扩展头信息里面,因此用Safari,Chrome,Firefox等浏览器查看http请求返回的数据就可以知道缓存是否命中。 性能测试对指定缓存进行压力测试,qps最高达到2300req/s,此时系统的cpu,内存等资源仍然很低,而千兆网卡则全部写满,瓶颈已不在cpu和内存上了,达到预期目标。 update(2012-10-29): 1、此方案中memcached与Nginx可放在同一台服务器上,必须两者间的数据交换过大导致网卡瓶颈 |