Ⅰ openresty 適合長連接么
OpenResty (也稱為 ngx_openresty)是一個全功能的 Web 應用伺服器,它打包了標準的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數依賴項。
OpenResty 通過匯聚各種設計精良的 Nginx 模塊,從而將 Nginx 有效的變成一個強大的 Web 應用。
如果要生成exe的話 那就只能在宿主語言里實現 可以寫個win32 然後把lua的基本庫都包含進去代碼直接寫成一個字元串然後在宿主語言里用lua的loadstring()來調用這個字元串
Ⅲ openresty怎麼執行curl語句
system():和 C 語言中的 system() 函數的用法是一樣的,參數為命令行,成功則返回命令輸出的最後一行,失敗則返回 FALSE。
shell_exec():執行命令,然後返回命令執行後的 stdout 輸出。
passthru():直接執行命令,然後將輸出內容直接顯示到網頁上。
在這里,curl 的輸出不用顯示到網頁上,所以 system() 可能比較合適。
Ⅳ openresty lua代碼可以編輯嗎
調試lua現有的幾種方案: 1)luaedit : 編輯斷點和斷點命中查看那些都讓習慣用vs的人感到親切,但是它只是在純lua環境下的編輯器,也就是說和期望程序運行中能借用它來調試腳本可能性不大(至少我沒有試驗出來)
Ⅳ openresty怎麼接收POST來的JSON數據並存入MYSQL
json的數據json.loads進來以後會變成一個json的對象,你需要自己把python對象中的欄位值取出來,拼成sql語句
你可以把這個過程封裝成一個函數
import json
def save_json(json_str):
obj = json.loads(json_str)
sql = 'insert into tbl values ("%s")' % obj['id'] #這里注意編碼,要轉成資料庫的編碼格式
#blabla
Ⅵ openresty編寫代碼怎麼用命令啟動和執行
通過OpenResty,你可以把nginx的各種功能進行自由拼接,更重要的是,開發門檻並不高,這一切都是用強大輕巧的Lua語言來操控。
Ⅶ 如何單步調試OpenResty中的Lua代碼
LuaStudio編輯調試器軟體可以注入到宿主程序內對lua腳本進行調
Ⅷ 如何在Ubuntu 16.04上使用Nginx的OpenResty Web框架
第1步 - 下載OpenResty的源代碼和依賴關系
在本節中,我們將從源代碼安裝OpenResty。
首先,從OpenResty網站的下載頁面找到最新的OpenResty源代碼版本。下載tarball,確保如果更改了版本號,請使用最新版本號。
wget https://openresty.org/download/openresty-1.11.2.2.tar.gz
下載PGP密鑰文件,以便我們可以驗證文件的內容。
wget https://openresty.org/download/openresty-1.11.2.2.tar.gz.asc
接下來,我們需要添加作者的公共密鑰,如下載頁面上所列。在撰寫本文時,這是公鑰A0E98066 。但是,請檢查它是否已更改;它被列在同一下載頁面上。
gpg --keyserver pgpkeys.mit.e --recv-key A0E98066
第2步 - 安裝OpenResty
我們將配置OpenResty與PCRE正則表達式和IPv6支持。我們還將通過提供-j2標志來並行化構建過程的一部分,這將告訴make 2個作業可以同時運行。此命令將主要測試所有依賴項是否可用於您的系統,並收集將由構建步驟稍後使用的信息。它也已經構建了一些依賴項,如LuaJIT。./configure -j2 --with-pcre-jit --with-ipv6
然後,您可以通過提供-j2並行度標志來構建OpenResty。這將編譯OpenResty本身。make -j2
最後,您可以安裝OpenResty。使用sudo確保所有文件可以復制到系統上的正確位置,以便OpenResty可以在運行時找到它們。sudo make install
您需要在防火牆中允許HTTP連接才能使Web伺服器正常工作。sudo ufw allow http
您也可以選擇允許HTTPS與sudo ufw allow https如果你要使用它。您可以通過檢查防火牆的狀態來驗證防火牆的更改。sudo ufw status
您應該看到顯示的輸出中允許HTTP流量(埠80 ),以及如果您添加它的HTTPS(埠443 )。
您現在可以檢查安裝是否有效。首先,啟動OpenResty。sudo /usr/local/openresty/bin/openresty
如果命令成功,它將立即完成而不輸出文本。在這種情況下,您可以在瀏覽器中訪問http:// your_server_ip 。 你會看到一個頁面,說歡迎來到OpenResty!確認它已完全安裝和工作。
您現在可以停止OpenResty伺服器。sudo /usr/local/openresty/bin/openresty -s quit
OpenResty已安裝,但您仍需要配置OpenResty在啟動時運行,所以伺服器不必手動啟動。
第3步 - 將OpenResty設置為服務
在這里,我們將OpenResty設置為一個服務,所以它在啟動時自動啟動。我們將使用systemd init服務。 您可以閱讀此systemd基礎教程了解更多信息,以及本單元文件教程 ,了解單元文件的具體信息。
首先使用nano或您喜歡的文本編輯器創建一個新的systemd文件。sudo nano /etc/systemd/system/openresty.service
對於本教程,我們將從全新安裝中復制默認的Nginx systemd文件,並針對OpenResty進行修改。
第4步 - 配置OpenResty
要配置OpenResty,我們使用默認的Nginx配置作為參考,以便它大部分匹配你可能會熟悉的。 首先,再次打開OpenResty配置文件: sudo nano /usr/local/openresty/nginx/conf/nginx.conf
這一次,我們將修改http塊並將此http塊中的server塊移動到一個新文件以具有更好的結構。 首先,找到http {行,並刪除之後的一切,除了最後一行與對應的} 。
當前/usr/local/openresty/nginx/conf/nginx.conf
user www-data;worker_processes auto;pid /run/openresty.pid;events {
worker_connections 1024;}http {
include mime.types;
default_type application/octet-stream;
. . .}
然後,將以下內容復制到http塊中,以便整個文件看起來像這樣。我們將一次過一個更改。
/usr/local/openresty/nginx/conf/nginx.conf
user www-data;worker_processes auto;pid /run/openresty.pid;events {
worker_connections 1024;}http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/openresty/access.log;
error_log /var/log/openresty/error.log;
gzip on;
gzip_disable "msie6";
include ../sites/*;
}
保存並關閉文件。 我們對默認文件所做的更改是:
取消tcp_nopush on; ,它告訴OpenResty只發送完整的數據包。 當使用sendfile選項時,此選項很有用,這將允許OpenResty優化將靜態文件發送到客戶端。
添加tcp_nodelay on; 。 此選項將嘗試盡快發送數據包,這可能看起來與上述選項相反,但它在不同的時間使用。 tcp_nodelay僅在對HTTP請求使用keepalive選項時使用,這是通過Web瀏覽器連接到Web伺服器,這將避免每次請求時啟動HTTP連接的開銷。
添加和修改ssl_protocols和ssl_prefer_server_ciphers行。這些選項配置OpenResty的SSL選項。我們刪除了易受已知的HTTPS攻擊的舊協議,例如POODLE攻擊。
添加access_log和error_log行,它們配置Web伺服器的日誌位置。 我們將日誌存儲在上一步中創建的/var/log/openresty目錄中。
取消注釋gzip on並添加gzip_disable "msie6" 。這些選項將配置GZIP,這將壓縮網頁,以便有更少的數據傳輸。我們還添加了最後一個選項,因為Internet Explorer 6(及更早版本)並不總是正確處理GZIP內容。
添加include ../sites/*; ,它告訴OpenResty在/usr/local/openresty/nginx/sites目錄中查找額外的配置文件,稍後我們將創建它。
刪除所有server塊,我們將在此步驟中稍後重新定位到新文件。
/usr/local/openresty/nginx/sites/default.conf
第5步 - 使用OpenResty Lua模塊
/usr/local/openresty/nginx/sites/default.conf content_by_lua_block示例
/usr/local/openresty/nginx/sites/default.conf content_by_lua_file示例
/usr/local/openresty/nginx/html/default/index.lua
Ⅸ 如何在openresty里解析域名
比如在使用 Mysql 實例時某些雲會給一個私有的域名搭配自有的 nameserver 使用
local client = mysql:new()
client:connect({
host = "rdsmxxxxxx.mysql.rds.xxxx.com",
port = 3306,
database = "test",
user = "test",
password = "123456"
})
以上代碼在直接使用時往往會報一個無法解析的錯誤。那麼怎麼在 openresty 中使用域名呢
搭配 resolver 指令
我們可以直接在 nginx 的配置文件中使用 resolver 指令直接設置使用的 nameserver 地址。
官方文檔中是這么描述的
Syntax: resolver address ... [valid=time] [ipv6=on|off];
Default: —
Context: http, server, location
一個簡單的例子
resolver 8.8.8.8 114.114.114.114 valid=3600s;
不過這樣的問題在於 nameserver 被寫死在配置文件中,如果使用場景比較復雜或有內部 dns服務時維護比較麻煩。
進階玩法
我們的代碼常常運行在各種雲上,為了減少維護成本,我採用了動態讀取本機 /etc/resolv.conf 的方法來做。
廢話不說,讓我們一賭為快。
local pcall = pcall
local io_open = io.open
local ngx_re_gmatch = ngx.re.gmatch
local ok, new_tab = pcall(require, "table.new")
if not ok then
new_tab = function (narr, nrec) return {} end
end
local _dns_servers = new_tab(5, 0)
local _read_file_data = function(path)
local f, err = io_open(path, 'r')
if not f or err then
return nil, err
end
local data = f:read('*all')
f:close()
return data, nil
end
local _read_dns_servers_from_resolv_file = function()
local text = _read_file_data('/etc/resolv.conf')
local captures, it, err
it, err = ngx_re_gmatch(text, [[^nameserver\s+(\d+?\.\d+?\.\d+?\.\d+$)]], "jomi")
for captures, err in it do
if not err then
_dns_servers[#_dns_servers + 1] = captures[1]
end
end
end
_read_dns_servers_from_resolv_file()
通過上述代碼我們成功動態拿到了一組 nameserver 的地址,下面就可以通過 resty.dns.resolver 大殺四方了
local require = require
local ngx_re_find = ngx.re.find
local lrucache = require "resty.lrucache"
local resolver = require "resty.dns.resolver"
local cache_storage = lrucache.new(200)
local _is_addr = function(hostname)
return ngx_re_find(hostname, [[\d+?\.\d+?\.\d+?\.\d+$]], "jo")
end
local _get_addr = function(hostname)
if _is_addr(hostname) then
return hostname, hostname
end
local addr = cache_storage:get(hostname)
if addr then
return addr, hostname
end
local r, err = resolver:new({
nameservers = _dns_servers,
retrans = 5, -- 5 retransmissions on receive timeout
timeout = 2000, -- 2 sec
})
if not r then
return nil, hostname
end
local answers, err = r:query(hostname, {qtype = r.TYPE_A})
if not answers or answers.errcode then
return nil, hostname
end
for i, ans in ipairs(answers) do
if ans.address then
cache_storage:set(hostname, ans.address, 300)
return ans.address, hostname
end
end
return nil, hostname
end
ngx.say(_get_addr("www..com"))
ngx.say(_get_addr("192.168.0.1"))
我這邊把解析的結果放入了 lrucache 緩存了5分鍾,你們同樣可以把結果放入 shared 中來減少 worker 查詢次數。
高階玩法
現在我們已經實現了自緩存體系的 dns 查詢,如果搭配 resty.http 就會達到更好的效果。
一個簡單的例子是,通過解析 uri 得到 hostname 、 port 、 path ,把 hostname 扔給自緩存 dns 獲取結果
發起 request 請求, addr + port connect 之,設置 header 的 host 為 hostname , path等值來實現 ip 直接訪問等高階用法。
這里就不過多的闡述了。
最終的演示例子如下
local client = mysql:new()
client:connect({
host = _get_addr(conf.mysql_hostname),
port = 3306,
database = "test",
user = "test",
password = "123456"
})
Ⅹ openresty redis 怎麼連接池
1.安裝lua解釋器
wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz (http://luajit.org/download.html)
配置lua Lib和include/luajit-$version目錄為環境變數
2.下載ngx_devel_kit和lua-nginx-mole
https://codeload.github.com/simpl/ngx_devel_kit/tar.gz/v0.2.19 ( https://github.com/simpl/ngx_devel_kit/tags)
https://codeload.github.com/openresty/lua-nginx-mole/tar.gz/v0.9.10 (https://github.com/openresty/lua-nginx-mole/tags)
3.安裝配置nginx
http://nginx.org/download/nginx-1.4.7.tar.gz (http://nginx.org/en/download.html)
nginx configue時候,將ngx_devel_kit和lua-nginx-mole兩個編入到nginx中
然後make 和make install
4.安裝成功之後
就可以在nginx.conf的location中嵌入lua代碼,相當強大!