Nginx配置srcache_nginx模块搭配Redis建立缓存系统

1. nginx模块

--add-module=../modules/ngx_devel_kit-0.2.18
--add-module=../modules/set-misc-nginx-module-0.22rc8
--add-module=../modules/srcache-nginx-module-0.22
--add-module=../modules/redis-nginx-module-0.3.6
--add-module=../modules/redis2-nginx-module-0.10

2. redis安装配置

# vim redis.conf
daemonize yes
pidfile /var/run/redis-6379.pid
port 6379
bind 127.0.0.1
timeout 0
tcp-keepalive 0
loglevel notice
logfile stdout
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 8096mb
maxmemory-policy volatile-ttl
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

由于只把redis当做缓存使用,因此没有启用持久化。

3. nginx配置

# vim nginx.conf
http
{
    include    mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '"$status" $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    '"$gzip_ratio" $request_time $bytes_sent $request_length';

    log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" '
                '"$status" $body_bytes_sent $request_time $bytes_sent $request_length '
                '[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';

    set_real_ip_from 10.0.0.0/8;
    real_ip_header X-Forwarded-For;

    include     vhosts/test.jb51.net.conf;
}
# vim vhosts/test.jb51.net.conf
upstream redis {
    server 127.0.0.1:6379;
    keepalive 512;
}

server
    {
    listen    80;
    server_name test.jb51.net;
    index index.html index.htm index.php;
    root /data/test.jb51.net/webroot;

    location ~ .*\.php {
        srcache_store_private on;
        srcache_methods GET;
        srcache_response_cache_control off;

        if ($uri ~ /jb51.net/pp.php$){
            set $key $request_uri;
            set_escape_uri $escaped_key $key;
            srcache_fetch GET /redis $key;
            srcache_default_expire 172800;
            srcache_store PUT /redis2 key=$escaped_key&exptime=$srcache_expire;

            #add_header X-Cached-From $srcache_fetch_status;
            #set_md5 $md5key $key;
            #add_header X-md5-key $md5key;
            #add_header X-Cached-Store $srcache_store_status;
            #add_header X-Key $key;
            #add_header X-Query_String $query_string;
            #add_header X-expire $srcache_expire;

 access_log /data/httplogs/test.jb51.net-photo-access.log srcache_log;
        }

        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors on;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
     }

    location = /redis {
        internal;
        set_md5 $redis_key $args;
        redis_pass redis;
    }

    location = /redis2 {
        internal;

        set_unescape_uri $exptime $arg_exptime;
        set_unescape_uri $key $arg_key;
        set_md5 $key;

        redis2_query set $key $echo_request_body;
        redis2_query expire $key $exptime;
        redis2_pass redis;
    }

    error_log /data/httplogs/test.jb51.net-error.log;
    access_log /data/httplogs/test.jb51.net-aceess.log main;

}

4. 测试
没有做缓存状态:

有做缓存状态:

5. 响应头状态
第一次请求:

再次请求:

6. 查看redis是否缓存以及过期时间

PS:srcache-nginx-module模块指令说明:
srcache_fetch
语法:srcache_fetch <method> <uri> <args>?
默认值:no
配置段:http, server, location, location if
查询缓存。返回200说明缓存命中,直接从缓存响应客户端请求。非200需要后端程序处理。
srcache_fetch_skip
语法:srcache_fetch_skip <flag>
默认值:srcache_fetch_skip 0
配置段:http, server, location, location if
<flag>支持nginx变量。当这个参数值不为空和不等于0,则从缓存取数据过程被无条件跳过。
srcache_store
语法:srcache_store <method> <uri> <args>?
默认值:no
配置段:http, server, location, location if
将当前请求的响应存入缓存。可以使用srcache_store_skip和srcache_store_max_size指令禁用缓存。不管是响应状态行,响应头,响应体都会被缓存。默认情况下,下列特殊响应头不会被缓存:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailers
  • Transfer-Encoding
  • Upgrade
  • Set-Cookie

可以使用srcache_store_pass_header、srcache_store_hide_header指令来控制哪些头要缓存哪些不要。

注意:即使所有的响应数据被立即发送,当前的nginx请求生命周期未必完成,直到srcache_store子请求完成。这意味着服务器端延迟关闭TCP连接,或下一个请求服务发送同一个TCP连接。
srcache_store_max_size
语法:srcache_store_max_size <size>
默认值:srcache_store_max_size 0
配置段:http, server, location, location if
当响应体超过该值,将不会缓存。
当后端缓存存储有对缓存数据做硬限制,这个指令非常有用。比如memcached服务器,上限是1M。
默认值0,不限制。
srcache_store_skip
语法:srcache_store_skip <flag>
默认值:srcache_store_skip 0
配置段:http, server, location, location if
<flag>支持nginx变量。当这个参数值不为空和不等于0,则从存入缓存过程被无条件跳过。
srcache_store_statuses
语法:srcache_store_statuses <status1> <status2> ..
默认值:srcache_store_statuses 200 301 302
配置段:http, server, location, location if
该指令控制那些状态码响应被缓存。
srcache_header_buffer_size
语法:srcache_header_buffer_size <size>
默认值:srcache_header_buffer_size 4k/8k
配置段:http, server, location, location if
在序列化响应头时控制头缓冲大小。默认大小为页面大小,通常为4k或8k,取决于具体平台。
注意:该大小是以每个头的,因此,需要足够大来容纳最大响应头。
srcache_store_hide_header
语法:srcache_store_hide_header <header>
默认值:no
配置段:http, server, location, location if
默认情况下,除了以下头缓存所有响应头:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailers
  • Transfer-Encoding
  • Upgrade
  • Set-Cookie

可以隐藏多个响应头,不区分大小写。如

srcache_store_hide_header X-Foo;
srcache_store_hide_header Last-Modified;

srcache_store_pass_header

语法:srcache_store_pass_header <header>
默认值:no
配置段:http, server, location, location if
默认情况下,除了以下头缓存所有响应头:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailers
  • Transfer-Encoding
  • Upgrade
  • Set-Cookie

可以缓存多个响应头,不区分大小写。如

srcache_store_pass_header Set-Cookie;
srcache_store_pass_header Proxy-Autenticate;

srcache_methods
语法:srcache_methods <method>...
默认值:srcache_methods GET HEAD
配置段:http, server, location
srcache_ignore_content_encoding
语法:srcache_ignore_content_encoding on|off
默认值: srcache_ignore_content_encoding off
配置段:http, server, location, location if
内容是否编码。
建议后端服务器禁用gzip/deflate压缩。在nginx.conf配置:

proxy_set_header Accept-Encoding "";

srcache_request_cache_control
语法:srcache_request_cache_control on|off
默认值:srcache_request_cache_control off
配置段:http, server, location
当该指令为on时,请求头Cache-Control和Pragma按照下面的方法处理:
1. srcache_fetch查询缓存操作时,当请求头Cache-Control: no-cache 、 Pragma: no-cache 将跳过。
2. srcache_store存入缓存操作时,当请求头Cache-Control: no-store将跳过。
当该指令为off时,将禁用此功能,对于繁忙的站点依赖缓存加速被认为是最安全的。
srcache_response_cache_control
语法:srcache_response_cache_control on|off
默认值:srcache_response_cache_control on
配置段:http, server, location
当该指令为on时,响应头Cache-Control和Expires按照下面的方法处理:

Cache-Control: private skips srcache_store,
Cache-Control: no-store skips srcache_store,
Cache-Control: no-cache skips srcache_store,
Cache-Control: max-age=0 skips srcache_store,
Expires: <date-no-more-recently-than-now> skips srcache_store.

该指令优先级比srcache_store_no_store,srcache_store_no_cache,srcache_store_private高。
srcache_store_no_store
语法:srcache_store_no_store on|off
默认值:srcache_store_no_store off
配置段:http, server, location
开启该指令,将强制响应头Cache-Control: no-store。默认为关闭。
srcache_store_no_cache
语法:srcache_store_no_cache on|off
默认值:srcache_store_no_cache off
配置段:http, server, location
开启该指令,将强制响应头Cache-Control: no-cache。默认为关闭。
srcache_store_private
语法:srcache_store_private on|off
默认值:srcache_store_private off
配置段:http, server, location
开启该指令,将强制响应头Cache-Control: private。默认为关闭。
srcache_default_expire
语法:srcache_default_expire <time>
默认值:srcache_default_expire 60s
配置段:http, server, location, location if
控制默认过期时间。当响应头既没有Cache-Control: max-age=N也没有指定Expires时,允许的$srcache_expire变量值。
该值必须小于597hours。
srcache_max_expire
语法:srcache_max_expire <time>
默认值:srcache_max_expire 0
配置段:http, server, location, location if
控制最大缓存时间,此设置优先级高于其他计算方法。
该值必须小于597hours。
默认为0,不限制。

(0)

相关推荐

  • spring结合redis如何实现数据的缓存

    1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错.因为commons-pooljar的目录根据版本的变化,目录结构会变.前面的版本是org.apache.pool,而后面的版本是org.apache.pool2... style="background-color: #0098dd; color: white; font-s

  • redis缓存的简单操作(get、put)

    本文介绍简单的redis缓存操作,包括引入jedisjar包.配置redis.RedisDao需要的一些工具.向redis中放数据(put).从redis中取数据(get).访问redis时的逻辑 一.引入jedis jar包 <!-- java访问redis的jar包jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId&g

  • php操作redis缓存方法分享

    php redis缓存操作 <?php /** * Redis缓存操作 * @author hxm * @version 1.0 * @since 2015.05.04 */ class RCache extends Object implements CacheFace { private $redis = null; //redis对象 private $sId = 1; //servier服务ID private $con = null;//链接资源 /** * 初始化Redis * *

  • 图文详解Windows下使用Redis缓存工具的方法

    一.简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合). 这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记

  • Python的Flask框架使用Redis做数据缓存的配置方法

    Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统.会把数据读入内存中提高存取效率.Redis性能极高能支持超过100K+每秒的读写频率,还支持通知key过期等等特性,所以及其适合做缓存. 下载安装 根据redis中文网使用wget下载压缩包 $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz $ tar xzf redis-3.0.5.tar.gz $ cd redis-3.0.5 $ make 二进制文

  • Redis缓存详解

    下面来正式分享今天的文章吧: .搭建Redis服务端,并用客户端连接 .封装缓存父类,定义Get,Set等常用方法 .定义RedisCache缓存类,执行Redis的Get,Set方法 .构造出缓存工厂调用方法 下面一步一个脚印的来分享: .搭建Redis服务端,并用客户端连接 首先,咋们去这个地址下载安装文件https://github.com/dmajkic/redis/downloads,我这里的版本是:redis-2.4.5-win32-win64里面有32位和64位的执行文件,我这里服

  • Spring Boot 基于注解的 Redis 缓存使用详解

    看文本之前,请先确定你看过上一篇文章<Spring Boot Redis 集成配置>并保证 Redis 集成后正常可用,因为本文是基于上文继续增加的代码. 一.创建 Caching 配置类 RedisKeys.Java package com.shanhy.example.redis; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import org.springf

  • CI框架中redis缓存相关操作文件示例代码

    本文实例讲述了CI框架中redis缓存相关操作文件.分享给大家供大家参考,具体如下: redis缓存类文件位置: 'ci\system\libraries\Cache\drivers\Cache_redis.php' <?php /** * CodeIgniter * * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * * Licensed under

  • Redis整合Spring结合使用缓存实例

    一.Redis介绍 什么是Redis?       redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是

  • PHP使用redis实现统计缓存mysql压力的方法

    本文实例讲述了PHP使用redis实现统计缓存mysql压力的方法.分享给大家供大家参考,具体如下: <?php header("Content-Type:text/html;charset=utf-8"); include 'lib/mysql.class.php'; $mysql_obj = mysql::getConn(); //redis $redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); if(is

随机推荐