OpenResty 配合 Lua 腳本的使用

OpenResty 配合 Lua 腳本的使用實踐

在高并發互聯網服務中,傳統的 Web 服務器往往難以同時兼顧性能與靈活性。而 OpenResty 作為一個基于 Nginx + LuaJIT 的高性能 Web 平臺,能夠讓我們在保持 Nginx 高并發性能的同時,使用 Lua 腳本 動態擴展其功能,從而滿足業務快速迭代與復雜邏輯處理的需求。


一、什么是 OpenResty?

OpenResty 是一個將 Nginx 與 LuaJIT 深度集成的 Web 平臺。它內置了豐富的第三方模塊,例如 ngx_lualua-resty-* 系列庫,使得開發者可以在 Nginx 的請求處理階段靈活地編寫 Lua 腳本,實現:

  • 動態路由分發
  • API 網關邏輯
  • 緩存和限流
  • 請求/響應數據處理
  • 與后端數據庫、Redis、Kafka 等交互

相比于傳統的修改 Nginx C 模塊,Lua 的開發效率要高很多。


二、OpenResty 的典型應用場景

  1. API 網關
    使用 Lua 腳本實現動態路由轉發、請求鑒權、流量控制等邏輯。

  2. 緩存層
    借助 lua-resty-redislua-resty-memcached,快速實現高性能的本地緩存與分布式緩存。

  3. A/B 測試與灰度發布
    在請求入口動態判定用戶群體,進行不同的后端分流。

  4. 安全防護
    可以通過 Lua 腳本編寫自定義的 WAF(Web 應用防火墻)規則,攔截惡意請求。


三、基本配置示例

以一個最簡單的 Lua 腳本響應示例來說明 OpenResty 的使用。

1. 安裝 OpenResty

在 Linux 系統中:

# 以 CentOS 為例
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
sudo yum install -y openresty

安裝完成后,Nginx 命令替換為:

openresty -v

2. 配置 Nginx + Lua

編輯 OpenResty 配置文件(通常是 /usr/local/openresty/nginx/conf/nginx.conf):

worker_processes  1;events {worker_connections  1024;
}http {server {listen 8080;location /lua {default_type text/html;content_by_lua_block {ngx.say("Hello, OpenResty with Lua!");}}}
}

3. 啟動 OpenResty

openresty -p `pwd`/ -c conf/nginx.conf

瀏覽器訪問 http://localhost:8080/lua,就能看到輸出:

Hello, OpenResty with Lua!

四、進階使用:Lua 腳本調用 Redis

下面演示一個更實用的例子:用 Lua 腳本查詢 Redis 中的值。

1. 安裝 Lua Redis 庫

luarocks install lua-resty-redis

2. 配置示例

在 Nginx 配置中加入:

server {listen 8080;location /get_redis {content_by_lua_block {local redis = require "resty.redis"local red = redis:new()red:set_timeout(1000)  -- 1 秒超時local ok, err = red:connect("127.0.0.1", 6379)if not ok thenngx.say("failed to connect: ", err)returnendlocal res, err = red:get("my_key")if not res thenngx.say("failed to get: ", err)returnendif res == ngx.null thenngx.say("key not found")returnendngx.say("redis value: ", res)}}
}

3. 驗證效果

先在 Redis 中寫入數據:

redis-cli set my_key "Hello Redis"

訪問 http://localhost:8080/get_redis,返回結果:

redis value: Hello Redis

五、總結

通過以上示例可以看到,OpenResty + Lua 為我們提供了一個高性能且靈活的 Web 開發平臺。它既能承載高并發請求,又能通過 Lua 腳本快速實現復雜邏輯,特別適合需要動態擴展的場景,如 API 網關、緩存服務、安全防護等。

如果你習慣使用 Nginx + 后端應用 的傳統模式,可以嘗試將一些邏輯下沉到 OpenResty,用 Lua 實現更高效的邊緣處理,減輕后端壓力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98607.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98607.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

香港券商櫃臺系統發展分析與市場觀察

香港券商櫃臺系統發展分析與市場觀察 一、市場環境與交易機制變革 2025年以來,香港證券市場表現活躍。港交所現貨市場平均每日成交金額達2,402億港元,同比增長118%。南向交易(港股通)日均成交額佔比提升至23%,單日淨…

AR技術:多行業數字化轉型的加速引擎

在數字化浪潮的推動下,增強現實(AR www.teamhelper.cn )技術正突破傳統娛樂和游戲領域的局限,成為各行業數字化轉型的重要力量。從工業制造到醫療健康,從教育培訓到零售購物,AR技術以其獨特的虛實融合能力&…

第6篇、Kafka 高級實戰:生產者路由與消費者管理

Kafka 高級實戰:生產者路由與消費者管理(Python 版)從基礎到進階:深入理解 Kafka 的生產者消息路由、消費者 Offset 管理,以及 Exactly-Once 語義實現 實戰導向:提供完整的可運行代碼示例,涵蓋自…

基于Python讀取多個excel豎向拼接為一個excel

在Python中,可以使用pandas庫結合glob模塊來遍歷讀取多個Excel文件,并將它們豎向拼接為一個DataFrame對象。以下是完整的實現方法: 文章目錄方法1:使用glob匹配文件 pd.concat()方法2:使用列表推導式(更簡…

Linux《進程信號(下)》

在之前的Linux《進程信號(上)》當中我們已經了解了進程信號的基本概念以及知道了信號產生的方式有哪些,還了解了信號是如何進行保存的,那么接下來在本篇當中就將繼續之前的學習了解信號是如何處理的。除此之外還會了解到中斷的概念…

android 性能優化—ANR

ANR產生原理ANR(Application Not Responding)是 Android 對 “應用主線程卡死” 的系統級保護機制: 當 輸入事件、廣播、服務 等在規定時間內未被處理完畢,SystemServer 會彈框并殺進程,防止整個系統跟著假死。計時起點…

stm32——單總線,DHT11

目錄 一、單總線協議的原理和應用 單總線協議指的是只采用一根信道來進行數據傳輸,通信指的是雙方(MCU與傳感器)通過一根信道進行數據交互,所以按照數據的傳輸方向,只能采用半雙工通信方式,比較典型的傳感器…

css3之grid布局

容器:gird container開啟grid布局的元素 項目:grid items容器里面的子元素,不包括后代元素 顯式網格(單元格):通過grid-template-columns和grid-template-rows指定的網格,注意項目不等于單元格,…

C++容器:list

一、list的介紹及使用 list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。list的底層是雙向鏈表結構,雙向鏈表中每個元素存儲在互不相關的獨立節點中,在節點中通過指針指向其前一個元素和后一個元素…

STL庫——map/set(類函數學習)

? ? ? ? ? づ?ど 🎉 歡迎點贊支持🎉 個人主頁:勵志不掉頭發的內向程序員; 專欄主頁:C語言; 文章目錄 前言 一、序列式容器和關聯式容器 二、set 系列的使用 2.1、set 和 multiset 參考文檔 2.2、set…

計算機網絡IP協議

1.TCP協議1.1 確認應答1.2 超時重傳1.3 連接管理1.4 滑動窗口1.5 流量控制1.6 擁塞控制 1.7 延時應答1.8 稍帶應答1.9 粘包問題1.10 異常情況2.IP協議 網絡層2.1 NAT機制下的幾種情況:同一個局域網中,內網ip訪問 內網 ip,可以的不同局域網中,內網IP訪問 內網IP,不行~~外網IP訪…

Windows電腦如何查看wifi連接記錄及連接時間

查詢WIFI 連接的記錄 echo netsh wlan show profiles netsh wlan show wlanreport POWERSHELL 腳本 Get-WinEvent -LogName Microsoft-Windows-WLAN-AutoConfig/Operational | Where-Object { $_.Id -in (8001,8002) } | Select-Object TimeCreated, Id, {Name"Action…

【golang學習筆記 gin 】1.2 redis 的使用

安裝redis go get -u github.com/gin-gonic/gin go get -u github.com/go-redis/redis/v8創建相關目錄 gotest->conifg->database.go->redis.go->controller ->index.go->model->user.go->router->router.gomain.go 封裝Redis package config impor…

Java學習之——“IO流“的進階流之序列化流的學習

一、核心概念:什么是序列化與反序列化?序列化 (Serialization): 將一個對象(在內存中的狀態)轉換成一個字節序列的過程。這個字節序列包含了對象的數據、對象的類型以及對象中存儲的屬性等信息。反序列化 (Deserializa…

機器學習04——決策樹(信息增益、信息增益率、ID3、C4.5、CART、剪枝、連續值缺失值處理)

上一章:機器學習03——線性模型 下一章:機器學習05——多分類學習與類別不平衡 機器學習實戰項目:【從 0 到 1 落地】機器學習實操項目目錄:覆蓋入門到進階,大學生就業 / 競賽必備 文章目錄一、決策樹的基本流程&#…

(論文速讀)從語言模型到通用智能體

論文題目:From Multimodal LLMs to Generalist Embodied Agents: Methods and Lessons(從多模式大型語言模型到多面手具身代理:方法和教訓)會議:CVPR2025摘要:我們研究了多模態大型語言模型(Multimodal Large Language…

【Epiq Solutions】Matchstiq? G20 和 Matchstiq? G40 AI SDR

Matchstiq? G20 和 Matchstiq? G40 產品簡介 Matchstiq? G20 和 Matchstiq? G40 是 Epiq Solutions 推出的 緊湊型、高性能軟件定義無線電(SDR)平臺,專為滿足 嚴苛 SWaP-C(體積、重量、功耗受限)場景下的戰術與移動…

基于Echarts+HTML5可視化數據大屏展示-旅游智慧中心

效果展示&#xff1a; 代碼結構&#xff1a;主要代碼實現 index.html布局 <!DOCTYPE html> <html lang"en" style"font-size: 97.5px;"> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"…

Docker 鏡像的使用

1.鏡像的基本信息[roothost1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 802541663949 2 weeks ago 78.1MB hello-world latest 1b44b5a3e06a 4 weeks ago 10.1kB執行 docker images 命令時加上 --no…

網絡編程;套接字;TCP通訊;UDP通訊;0909

思維導圖TCP服務器端和客戶端通訊服務器端 代碼#include<myhead.h> #define SER_IP "192.168.109.12"//我的虛擬機的ip #define SER_PORT 8888 int main() {//1.創建一個用于連接的套接字文件描述符int sfd socket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror(&…