欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nginx Lua 緩存配置的實(shí)現(xiàn)步驟

 更新時(shí)間:2024年10月10日 10:21:19   作者:營贏盈英  
在Web應(yīng)用緩存層次中,Nginx Lua緩存因其高效的協(xié)程機(jī)制,與Nginx的集成,以及OpenResty的擴(kuò)展性,成為了一種高性能的緩存解決方案,本文就來詳細(xì)介紹,感興趣的可以了解一下

摘要:

web 應(yīng)用業(yè)務(wù)緩存通常3級:

一級緩存:JVM 本地緩存

二級緩存:Redis集中式緩存

三級緩存:Nginx Proxy Cache 緩存 或 Nginx Lua 緩存

四級緩存:靜態(tài)資源CDN緩存 頁面靜態(tài)化

本文主要分享 Nginx Lua 緩存配置開發(fā)

鑒于 Nginx Proxy Cache 緩存的劣勢,在生產(chǎn)項(xiàng)目中很少使用,如果真正要體現(xiàn)出在距離用戶最近的位置設(shè)置緩存,需要使用 Nginx Lua 緩存,才能發(fā)揮出緩存的優(yōu)勢。

Lua 腳本語言出現(xiàn)前,需要使用 c 或 c++ 語言開發(fā)Nginx功能,難度大,風(fēng)險(xiǎn)高。Nginx和Lua集成后,可以通過 Lua 腳本配置 Nignx 。

Nginx Lua 腳本開發(fā)的優(yōu)勢:

協(xié)程機(jī)制

  • 協(xié)程是線程內(nèi)獨(dú)立的運(yùn)行單元,依附于線程的內(nèi)存模型,切換開銷小。
  • 完全可以使用同步方式編寫代碼,不需要考慮異步機(jī)制。如果執(zhí)行過程中遇到了類似IO的阻塞事件,會(huì)到Nginx異步模型epoll上注冊回調(diào)句柄,讓出cpu執(zhí)行權(quán)。如果異步模型接收到阻塞事件調(diào)用的返回后,喚醒對應(yīng)的協(xié)程。
  • 對共享變量的訪問,都無需加鎖。

Lua 的協(xié)程機(jī)制 類似于 Nginx 的協(xié)程機(jī)制。

Nginx 協(xié)程

  • nginx 每個(gè)worker進(jìn)程都是在epoll或kqueue這種事件模型之上,封閉成協(xié)程。
  • 每個(gè)請求都有一個(gè)協(xié)程處理
  • 即使 ngx_lua 相對 C 有一定的開銷,但依舊能保證高并發(fā)能力
  • nginx 每個(gè)工作進(jìn)程都創(chuàng)建一個(gè) lua 虛擬機(jī)
  • 工作進(jìn)程內(nèi)所有 協(xié)程 共享 這個(gè) lua 虛擬機(jī)
  • 每個(gè)外部請求都有一個(gè) lua 協(xié)程處理,每個(gè) lua 協(xié)程之間的數(shù)據(jù)隔離
  • lua 代碼調(diào)用 io 等異步接口時(shí),協(xié)程被掛起上下文數(shù)據(jù),向 epoll select 異步模型上注冊句柄 ,如果異步模型接收到阻塞事件的響應(yīng),喚醒協(xié)程,還原協(xié)程上下文,繼續(xù)執(zhí)行代碼。

        所以Nginx協(xié)程相比于 JVM的 servlet的多線程機(jī)制更高效。

Nginx 生命周期11個(gè)處理階段

可以在 Nginx 的生命周期過程中,添加 Lua 控制功能,實(shí)現(xiàn)對Nginx功能的配置。

NGX_HTTP_POST_READ_PHASE = 0                    // 讀取請求頭
NGX_HTTP_SERVER_REWRITE_PHASE = 0        // 執(zhí)行 uri rewrite    rewrite_handler
NGX_HTTP_FIND_CONFIG_PHASE                  // 根據(jù) uri 替換 location
NGX_HTTP_REWRITE_PHASE                          // 根據(jù)替換結(jié)果繼續(xù)執(zhí)行 rewrite rewrite_handler
NGX_HTTP_POST_REWRITE_PHASE              // 執(zhí)行 rewrite 后處理
NGX_HTTP_PREACCESS_PHASE       // 可以用于處理限流場景
                // 認(rèn)證預(yù)處理 請求限制(limit_req_handler) 連接限制(limit_conn_handler)
NGX_HTTP_ACCESS_PHASE              // 可用于處理 token 的場景
                // 認(rèn)證處理 auth_basic_handler   access_handler  
NGX_HTTP_POST_ACCESS_PHASE         // 認(rèn)證后處理 認(rèn)證不通過 丟包
NGX_HTTP_TRY_FILES_PHASE                // 深度 try 標(biāo)簽
NGX_HTTP_CONTENT_PHASE                 // 內(nèi)容處理   static_handler
NGX_HTTP_LOG_PHASE                           // 日志處理   log_handler

Nginx Lua 掛載點(diǎn)

init_by_lua                系統(tǒng)啟動(dòng)時(shí)調(diào)用

init_worker_by_lua        worker進(jìn)程啟動(dòng)時(shí)調(diào)用

set_by_lua                nginx變量使用復(fù)雜 lua return

rewrite_by_lua        重寫 url 規(guī)則

access_by_lua        權(quán)限驗(yàn)證階段

content_by_lua        內(nèi)容輸出階段(使用較多)

OpenResty

OpenResty 的優(yōu)勢:

  • 生產(chǎn)項(xiàng)目中可以使用 OpenResty 來進(jìn)行 Lua 功能開發(fā),因?yàn)?OpenResty 以 Nginx 為核心并集成了很多第三方模塊,默認(rèn)集成了 Lua 開發(fā)環(huán)境,使 Nginx 可以作為 Web Server 使用。
  • 借助于 Nginx 的事件驅(qū)動(dòng)模型和非阻塞 IO ,可實(shí)現(xiàn)高性能的 Web 應(yīng)用程序。
  • OpenResty 提供了大量組件如 Mysql  Redis  Memcached 等,使在 Nginx 上開發(fā) web 應(yīng)用更方便簡單。

OpenResty 可以通過 shared dic 共享內(nèi)存字典,實(shí)現(xiàn)遠(yuǎn)超過 proxy cache 性能的緩存,因?yàn)?shared dic 對所有 worker 進(jìn)程都可見,并加成了 LRU 淘汰規(guī)則。再加上 OpenResty 對 Redis 的支持,可以實(shí)現(xiàn)更高性能的三級緩存。

nginx.conf

...
# 配置 shared dictionary 的擴(kuò)展,聲明128m的內(nèi)存承載共享字典訪問
lua_shared_dict lua_cache 128m;
...

server {
...
# 設(shè)置location用來做訪問shared dict的lua文件
location /luadetail/get {
    default_type "application/json";
    content_by_lua_file ../lua/sharedis.lua
...
sharedis.lua


local args = ngx.req.get_uri_args()
local id = args["id"]
local redis = require "resty.redis"
local cache = redis:new()
local ok,err = cache:connect("172.16.16.16", 6379)
local product = cache:get("product_"..id)
if product == ngx.null or product == nil then
    local resp = ngx.location.capture("/product/get?id="..id)
    product = resp.body
end
ngx.say(product)

顯然,Nginx 緩存直接讀取 Redis 中的數(shù)據(jù)既能保證高效率,也不需要關(guān)心緩存中數(shù)據(jù)的更新失效策略,相比于使用 Nginx 服務(wù)器內(nèi)存作緩存載體更高效。

到此這篇關(guān)于Nginx Lua 緩存配置的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Nginx Lua 緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx實(shí)現(xiàn)404頁面的方法小結(jié)

    Nginx實(shí)現(xiàn)404頁面的方法小結(jié)

    這篇文章主要介紹了Nginx實(shí)現(xiàn)404頁面的方法小結(jié),需要的朋友可以參考下
    2017-08-08
  • nginx打印請求頭日志方法(親測可用)

    nginx打印請求頭日志方法(親測可用)

    之前想用nginx打印收到的請求的請求頭,但是只找到打印請求體的,沒有打印請求頭的,本文就來介紹一下nginx打印請求頭日志方法,感興趣的可以了解一下
    2023-11-11
  • Keepalived如何實(shí)現(xiàn)Nginx高可用

    Keepalived如何實(shí)現(xiàn)Nginx高可用

    這篇文章主要介紹了Keepalived如何實(shí)現(xiàn)Nginx高可用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Nginx訪問日志access_log配置及信息詳解(推薦)

    Nginx訪問日志access_log配置及信息詳解(推薦)

    當(dāng)你設(shè)置日志級別成debug,如果你在調(diào)試一個(gè)在線的高流量網(wǎng)站的話,你的錯(cuò)誤日志可能會(huì)記錄每個(gè)請求的很多消息,這樣會(huì)變得毫無意義,下面小編給大家介紹Nginx訪問日志access_log配置及信息詳解,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 使用Nginx反向代理與proxy_cache緩存搭建CDN服務(wù)器的配置方法

    使用Nginx反向代理與proxy_cache緩存搭建CDN服務(wù)器的配置方法

    linux下通過Nginx反向代理和proxy_cache緩存搭建CDN服務(wù)器加快Web訪問速度的配置方法
    2013-06-06
  • Nginx虛擬主機(jī)的配置步驟過程全解

    Nginx虛擬主機(jī)的配置步驟過程全解

    這篇文章主要為大家介紹了Nginx虛擬主機(jī)的配置步驟過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • nginx部署前端項(xiàng)目的超級詳細(xì)步驟記錄

    nginx部署前端項(xiàng)目的超級詳細(xì)步驟記錄

    眾所周知Nginx是一款高性能的http服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,這篇文章主要給大家介紹了關(guān)于nginx部署前端項(xiàng)目的超級詳細(xì)步驟,需要的朋友可以參考下
    2023-02-02
  • nginx 鏡像中文字符集使用詳解

    nginx 鏡像中文字符集使用詳解

    這篇文章主要為大家介紹了nginx 鏡像中文字符集使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • nginx+iis實(shí)現(xiàn)簡單的負(fù)載均衡

    nginx+iis實(shí)現(xiàn)簡單的負(fù)載均衡

    這篇文章主要為大家詳細(xì)介紹了nginx+iis實(shí)現(xiàn)一個(gè)簡單的負(fù)載均衡的方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Ubuntu?22.04.1?LTS?編譯安裝?nginx-1.22.1的配置過程

    Ubuntu?22.04.1?LTS?編譯安裝?nginx-1.22.1的配置過程

    Ubuntu安裝Nginx有兩種方式,一種是通過命令的方式,這種方式安裝的Nginx版本低,之前漏掃掃出來Nginx版本低,需要升級所以現(xiàn)在用編譯的方式安裝版本高點(diǎn)的,本文介紹Ubuntu22.04.1?LTS編譯安裝nginx1.22.1的配置過程,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2024-01-01

最新評論