OpenResty概念講解
OpenResty介紹
OpenResty® 是一個基於 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用於方便地搭建能夠處理超高併發、擴展性極高的動態 Web 應用、Web 服務和動態網關。
OpenResty® 通過匯聚各種設計精良的 Nginx 模塊(主要由 OpenResty 團隊自主開發),從而將 Nginx 有效地變成一個強大的通用 Web 應用平臺。這樣,Web 開發人員和系統工程師可以使用 Lua 腳本語言調動 Nginx 支持的各種 C 以及 Lua 模塊,快速構造出足以勝任 10K 乃至 1000K 以上單機併發連接的高性能 Web 應用系統。
OpenResty® 的目標是讓你的Web服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至於對遠程後端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應。
哪些公司正在用OpenResty
- OpenResty 應用的場景非常多,比如應用在 CDN 場景,典型的用戶包括又拍雲、CloudFlare;
- 京東主站的 API 網關,以及京東物流的第三方商家的網關層;
- 12306 應用 Openesty 主要是替代 Nginx 做負載均衡和反向代理,以及火車票在出現的時候反向最大的餘票的查詢等都是使用 OpenResty 來實現;
- 360 企業安全後端所有和安全相關的邏輯都是 OpenResty 實現的;
- 騰訊遊戲的廣告系統裏面所有的業務邏輯也是使用 OpenResty 來開發的;
- KONG 開源出來的一整套解決方案(雲原生 API gateway & Service Mash)也是基於 OpenResty 去做的。
OpenResty應用場景
其實官網 wiki 已經列了出來:
- 在lua中混合處理不同nginx模塊輸出(proxy, drizzle, postgres, redis, memcached等)。
- 在請求真正到達上游服務之前,lua中處理複雜的准入控制和安全檢查。
- 比較隨意的控制應答頭(通過Lua)。
- 從外部存儲中獲取後端信息,並用這些信息來實時選擇哪一個後端來完成業務訪問。
- 在內容handler中隨意編寫複雜的web應用,同步編寫異步訪問後端數據庫和其他存儲。
- 在rewrite階段,通過Lua完成非常複雜的處理。
- 在Nginx子查詢、location調用中,通過Lua實現高級緩存機制。
- 對外暴露強勁的Lua語言,允許使用各種Nginx模塊,自由拼合沒有任何限制。該模塊的腳本有充分的靈活性,同時提供的性能水平與本地C語言程序無論是在CPU時間方面以及內存佔用差距非常小。所有這些都要求LuaJIT 2.x是啓用的。其他腳本語言實現通常很難滿足這一性能水平。
功能需求
僅僅是部分功能(更加詳盡的不再一一列出)
第一個方面:在開發階段還是有大量重複性的、非功能性的模塊的開發,比如:身份驗證、登陸校驗、流量控制、頻次控制、安全等等這樣的事情要做。
第二個方面:就是線上運行的時候也存在大量的防刷,異常用戶行爲,需要進行行爲控制和分析,包括防刷、秒殺、抽獎類活動的一些流量控制等干預。
API網關彙總
以下圖來源於網絡,能有所參考
環境變量
腳本 啓動
創建lua目錄
連接數據庫
sql注入
https://moonbingbing.gitbooks.io/openresty-best-practices/content/openresty/safe_sql.html
亂碼問題:charset utf-8; #設置編碼
http {
server {
#監聽端口,若你的6699端口已經被佔用,則需要修改
listen 6100;
location /initProxy {
default_type text/html;
charset utf-8; #設置編碼
content_by_lua_file /opt/openresty-router/lua/lua_mysql_proxy_list.lua;
}}
如何創建配置文件選項呢
https://blog.csdn.net/daiyudong2020/article/details/53027934
由於函數定義等價於變量賦值,我們也可以把函數名替換爲某個 Lua 表的某個字段,例如
function foo.bar(a, b, c)
-- body ...
end
local color={first="red", "blue", third="green", "yellow"}
print(color["first"]) --> output: red
print(color[1]) --> output: blue
print(color["third"]) --> output: green
print(color[2]) --> output: yellow
print(color[3]) --> output: nil
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/function_before_use.html
點號與冒號操作符的區別
不要忘記了末尾的分號:
ngx.say("HelloWorld")