nginx中使用srcache_nginx模塊構建緩存

来源:http://www.cnblogs.com/chenpingzhao/archive/2016/01/21/5147044.html
-Advertisement-
Play Games

nginx中可以將lua嵌,讓nginx執行lua腳本,可以處理高併發,非阻塞的處理各種請求,openresty項目中可以使用nignx可以直接構建 srcache_nginx+redis緩存,而不用通過動態語言來處理(QPS可以輕鬆的提高了)看一下openresty中srcache-nginx-m...


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/

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇,運用 Linux 的 sysfs,控制本機上的 LED 燈,usr0 至 usr3,這次用 GPIO 控制外部的電路,點亮 LED 燈。 這次的全部材料: BBB 一臺 購買 BBB 自帶的 USB 數據線 麵包板一塊 470Ω 三枚(至少一枚) 白、紅、黃、綠 LED 燈各一個(至少一個)...
  • 一.概述 barrier(屏障)與互斥量,讀寫鎖,自旋鎖不同,它不是用來保護臨界區的。相反,它跟條件變數一樣,是用來協同多線程一起工作!!!條件變數是多線程間傳遞狀態的改變來達到協同工作的效果。屏障是多線程各自做自己的工作,如果某一線程完成了工作,就等...
  • linux回收站機制
  • 這個問題困擾了我,可能有兩個原因。1、文件夾許可權不夠,至少也要給出 USERS 組的可讀可寫許可權;2、文件夾的磁碟滿了,文件寫不進去了;如果是這個不能創建和寫的問題,很大的概率就是文件的許可權。沒有網上一大堆的解釋。改變方法:1 #chown-Rmysql:mysql/usr/local/mysql/...
  • 本文轉自調整虛擬記憶體,支持原創、尊重原創,分享知識!個人發現有些翻譯不當的地方,稍微做了下修改、調整。如果英文足夠NB,建議閱讀英文。 虛擬記憶體通常被進程、文件系統緩存以及內核消耗。虛擬記憶體的使用由很多因素決定,受以下參數影響: swappiness 參數值可為 0-100,控制系統 swap 的使...
  • 需求:把找到的文件逐行輸出,然後用rm在許可的情況下刪除前置準備:$lsrm.sh test1 test2 test3 test4 test5 test6$cat rm.sh#! /bin/bashwhile read fileinfodo rm -iv $fileinfodone< <( ...
  • TryVistalizator- this tool allows you to change display language in Windows editions other than (officially supported) Ultimate, like Starter, Home Ba...
  • 版權聲明:本內容為原創內容,轉載請聲明出處。原文地址:http://www.excelib.com/article/287/showfirewalld簡介Centos7中預設將原來的防火牆iptables升級為了firewalld,firewalld跟iptables比起來至少有兩大好處:1、fir...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...