nginx中使用srcache_nginx模块构建缓存

nginx中可以将lua嵌,让nginx执行lua脚本,可以处理高并发,非阻塞的处理各种请求,openresty项目中可以使用nignx可以直接构建 srcache_nginx + redis 缓存,而不用通过动态语言来处理(QPS可以轻松的提高了)

看一下openresty中srcache-nginx-module的工作流

好了废话不多说

一、安装

pcre

cd /usr/local/src
wget -c ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
tar zxf pcre-8.38.tar.gz

drizzle7

cd /usr/local/src/ 
wget http://openresty.org/download/drizzle7-2011.07.21.tar.gz 
tar xzvf drizzle-2011.07.21.tar.gz 
cd drizzle-2011.07.21/ 
./configure
make
make install
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

JIT(Just-In-Time Compiler)

wget -c http://luajit.org/download/LuaJIT-2.0.2.tar.gz
tar xzvf LuaJIT-2.0.2.tar.gz
cd LuaJIT-2.0.2
make install PREFIX=/usr/local/luajit
echo "/usr/local/luajit/lib" > /etc/ld.so.conf.d/usr_local_luajit_lib.conf
ldconfig

export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0

nginx

cd /usr/local/src
wget -c http://nginx.org/download/nginx-1.9.9.tar.gz
git clone https://github.com/simpl/ngx_devel_kit.git
git clone https://github.com/openresty/set-misc-nginx-module.git
git clone https://github.com/openresty/memc-nginx-module.git
git clone https://github.com/openresty/echo-nginx-module.git
git clone https://github.com/openresty/lua-nginx-module.git
git clone https://github.com/openresty/srcache-nginx-module.git
git clone https://github.com/openresty/drizzle-nginx-module.git
git clone https://github.com/openresty/rds-json-nginx-module.git
wget http://people.freebsd.org/~osa/ngx_http_redis-0.3.7.tar.gz

tar zxf nginx-1.9.9.tar.gz

cd nginx-1.9.9

./configure \
--prefix=/usr/local/nginx-1.9.9 \
--add-module=../memc-nginx-module \
--add-module=../srcache-nginx-module \
--add-module=../ngx_devel_kit \
--add-module=../ngx_image_thumb \
--add-module=../redis2-nginx-module \
--add-module=../echo-nginx-module  \
--add-module=../lua-nginx-module \
--add-module=../set-misc-nginx-module \
--add-module=../ngx_http_redis-0.3.7 \
--with-pcre=../pcre-8.38 \
--with-pcre-jit

make && make install

redis

cd /usr/local
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar zxf redis-3.0.6.tar.gz 

cd redis-3.0.6
make
./src/redis-server

配置文件

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

nginx的简单配置

user  www www;
worker_processes  auto;

error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    use epoll;
    worker_connections  65536;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    charset  utf-8;

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

    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]';
    
    server_tokens off;

    keepalive_timeout           60 20;
    client_header_timeout       3m;
    client_body_timeout         3m;
    send_timeout                3m;

    client_header_buffer_size           16k;
    large_client_header_buffers         4 32k;
    server_names_hash_max_size          512;
    server_names_hash_bucket_size       64;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;


    gzip  on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    upstream memcache {
        server 192.168.1.30:12000;
        keepalive 10;
    }
    upstream redis {
        server 127.0.0.1:6379;
        keepalive 20;
    }

    server
    {
        listen 90 default;
        server_name _;
        return 444;
    }
    include vhosts/*.conf;
}

二、srcache+memcache

server {
    listen       8099;
    server_name  192.168.1.30;
    root /data/www;
    index  index.php index.html index.htm;
    default_type text/plain;

    access_log  logs/host.access.log  main;

    location /hello{
        echo "This is a test";
    }
    location = /lua-version {
        content_by_lua '
            if jit then
                ngx.say(jit.version)
            else
                ngx.say(_VERSION)
                    end
           ';
    }


    location /memc {
        internal;
        memc_connect_timeout 100ms;
        memc_send_timeout 100ms;
        memc_read_timeout 100ms;
        set $memc_key $query_string;
        set $memc_exptime 300;
        memc_pass memcache;
    }

    location ~ \.php$ {
        charset        utf-8;
        default_type   text/html;
        set $key $uri$args;
        srcache_fetch GET /memc $key;
        srcache_store PUT /memc $key;
        add_header X-Cached-From $srcache_fetch_status; 
        add_header X-Cached-Store $srcache_store_status;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

第一次访问的时候

Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=UTF-8
Date:Wed, 20 Jan 2016 16:32:32 GMT
Keep-Alive:timeout=20
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Cached-From:MISS
X-Cached-Store:STORE

第二次访问

Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=UTF-8
Date:Wed, 20 Jan 2016 16:33:17 GMT
Keep-Alive:timeout=20
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Cached-From:HIT
X-Cached-Store:BYPASS

可以自定义哪些需要访问

三、srcache+redis

redis配置测试

server {
    listen       9001;
    server_name  192.168.1.30;
    root /data/www;
    index  index.php index.html index.htm;
    default_type text/plain;
    access_log  logs/host.access.log  main;

    location /testx{
        echo '1';
    }

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

        set $key $uri;
        set_escape_uri $escaped_key $key;
        srcache_default_expire 172800;
        srcache_fetch GET /redis_get $key;
        srcache_store PUT /redis_set 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;
        add_header X-uri $uri;
        access_log logs/9001-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_get {
        internal;
        set_md5 $redis_key $args;
        redis_pass redis;
    }
    location =/show{
        echo $request_uri; 
        echo $args;
    }

    location = /redis_set {
        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;
    }

    location = /one {
        set $value 'first';
        redis2_query set one $value;
        redis2_pass redis;
    }

    location = /get {
        set_unescape_uri $key $arg_key;  # this requires ngx_set_misc
        redis2_query get $key;
        redis2_pass redis;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

可以查看日志缓存是否命中

四、lua

Nginx下Lua处理阶段与使用范围

init_by_lua            http
set_by_lua             server, server if, location, location if
rewrite_by_lua         http, server, location, location if
access_by_lua          http, server, location, location if
content_by_lua         location, location if
header_filter_by_lua   http, server, location, location if
body_filter_by_lua     http, server, location, location if
log_by_lua             http, server, location, location if
timer

lua代码

ngx.req.read_body()  -- explicitly read the req body
local data = ngx.req.get_body_data()
if data then
    ngx.say("body data:")
    ngx.print(data)
    return
end

-- body may get buffered in a temp file:
local file = ngx.req.get_body_file()
if file then
    ngx.say("body is in file ", file)
else
    ngx.say("no body found")
end

local res = ngx.location.capture("/foo/index.php")
if res then
   ngx.say("status: ", res.status)
   ngx.say("body:")
   ngx.print(res.body)
end

nginx中配置

location /lua_test {
        content_by_lua_file conf/lua_test.lua;                                                                                      
}  

 

 

参考文章

https://github.com/openresty/lua-nginx-module

http://chenxiaoyu.org/2011/10/30/nginx-modules.html

http://www.ttlsa.com/nginx/nginx-lua-redis/

  

posted @ 2016-01-21 23:35  踏雪无痕SS  阅读(1843)  评论(0编辑  收藏  举报