日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openresty开发系列32--openresty执行流程之1初始化阶段

發(fā)布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openresty开发系列32--openresty执行流程之1初始化阶段 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

openresty開發(fā)系列32--openresty執(zhí)行流程之初始化階段

一)初始化階段

1)init_by_lua?? init_by_lua_block???? init_by_lua_file
語法:init_by_lua <lua-script-str>
語境:http
階段:loading-config
當nginx master進程在加載nginx配置文件時運行指定的lua腳本,
通常用來注冊lua的全局變量或在服務器啟動時預加載lua模塊:

[root@node5 conf]# cat nginx.conf
worker_processes? 4;

error_log logs/error.log;
error_log logs/debug.log debug;


events {
??? worker_connections? 1024;
}


http {
??? include?????? mime.types;
??? #default_type? application/octet-stream;
??? default_type? text/html;
??? charset utf-8;

??? sendfile??????? on;
??? # 關(guān)閉lua緩存,不需要每次重啟才生效,會犧牲一定性能
??? lua_code_cache on;

??? lua_shared_dict shared_data 10m;
??? keepalive_timeout? 65;

??? init_by_lua_block {
?? ?cjson = require "cjson"
??? }

??? server {
??????? listen?????? 80;
??????? server_name? www.server1.com;
?? ??? ?resolver 8.8.8.8;
??????? lua_ssl_verify_depth 2;
?? ?lua_ssl_trusted_certificate "/etc/ssl/certs/ca-bundle.crt";


?? ?location = /api {
?? ??? ?content_by_lua_block {
?? ??? ??? ?ngx.say(cjson.encode({dog = 5, cat = 6}))
?? ??? ?}
?? ?}

?? ?location / {
?? ??? ?root html;
?? ??? ?index index.html;
?? ?}

??????? error_page?? 500 502 503 504? /50x.html;
??????? location = /50x.html {
??????????? root?? html;
??????? }

??? }

}

從這段配置代碼,我們可以看出,其實這個指令就是初始化一些lua的全局變量,以便后續(xù)的代碼使用。

初始化lua_shared_dict共享數(shù)據(jù):

lua_shared_dict dogs 1m;

init_by_lua_block {
??? local dogs = ngx.shared.dogs;

??? dogs:set("Tom", 50)
??? dogs:set("flag",1)
}

server {
??? location = /api {
??????? content_by_lua_block {
??????????? local dogs = ngx.shared.dogs;
??????????? ngx.say(dogs:get("Tom"))
??????? }
??? }
}

lua_shared_dict的內(nèi)容不會在nginx reload時被清除。所以如果你不想在init_by_lua中重復初始化共享數(shù)據(jù),
那么你需要在你的共享內(nèi)存中設置一個標志位并在init_by_lua中進行檢查。

因為這個階段的lua代碼是在nginx forks出任何worker進程之前運行,
數(shù)據(jù)和代碼的加載將享受由操作系統(tǒng)提供的copy-on-write的特性,從而節(jié)約了大量的內(nèi)存。
不要在這個階段初始化你的私有l(wèi)ua全局變量,因為使用lua全局變量會照成性能損失,
并且可能導致全局命名空間被污染。
這個階段只支持一些小的LUA Nginx API設置:ngx.log和print、ngx.shared.DICT;


2)init_worker_by_lua
語法:init_worker_by_lua <lua-script-str>
語境:http
階段:starting-worker
在每個nginx worker進程啟動時調(diào)用指定的lua代碼。

用于啟動一些定時任務,比如心跳檢查,定時拉取服務器配置等等;此處的任務是跟Worker進程數(shù)量有關(guān)系的,
比如有2個Worker進程那么就會啟動兩個完全一樣的定時任務。

a、nginx.conf配置文件中的http部分添加如下代碼

init_worker_by_lua_file /usr/local/lua/init_worker.lua;

------------------------------------

b、/usr/local/lua/init_worker.lua;

local count = 0
local delayInSeconds = 3
local heartbeatCheck = nil

heartbeatCheck = function(args)
?? count = count + 1
?? ngx.log(ngx.ERR, "do check ", count)

?? local ok, err = ngx.timer.at(delayInSeconds, heartbeatCheck)

?? if not ok then
????? ngx.log(ngx.ERR, "failed to startup heartbeart worker...", err)
?? end
end

heartbeatCheck()

# 觀察日志:
# tail logs/debug.log
...
2019/08/23 19:09:18 [error] 77617#0: *431 [lua] init_worker.lua:7: heartbeatcheck(): do check 1, context: init_worker_by_lua*
2019/08/23 19:09:18 [error] 77618#0: *432 [lua] init_worker.lua:7: heartbeatcheck(): do check 1, context: init_worker_by_lua*
2019/08/23 19:09:18 [error] 77619#0: *433 [lua] init_worker.lua:7: heartbeatcheck(): do check 1, context: init_worker_by_lua*
2019/08/23 19:09:18 [error] 77620#0: *434 [lua] init_worker.lua:7: heartbeatcheck(): do check 1, context: init_worker_by_lua*
2019/08/23 19:09:21 [error] 77620#0: *436 [lua] init_worker.lua:7: do check 2, context: ngx.timer
2019/08/23 19:09:21 [error] 77617#0: *438 [lua] init_worker.lua:7: do check 2, context: ngx.timer
2019/08/23 19:09:21 [error] 77618#0: *437 [lua] init_worker.lua:7: do check 2, context: ngx.timer
2019/08/23 19:09:21 [error] 77619#0: *435 [lua] init_worker.lua:7: do check 2, context: ngx.timer
2019/08/23 19:09:24 [error] 77619#0: *439 [lua] init_worker.lua:7: do check 3, context: ngx.timer
2019/08/23 19:09:24 [error] 77617#0: *442 [lua] init_worker.lua:7: do check 3, context: ngx.timer
2019/08/23 19:09:24 [error] 77620#0: *441 [lua] init_worker.lua:7: do check 3, context: ngx.timer
...

ngx.timer.at:延時調(diào)用相應的回調(diào)方法;ngx.timer.at(秒單位延時,回調(diào)函數(shù),回調(diào)函數(shù)的參數(shù)列表);
可以將延時設置為0即得到一個立即執(zhí)行的任務,任務不會在當前請求中執(zhí)行不會阻塞當前請求,
而是在一個輕量級線程中執(zhí)行。
?
另外根據(jù)實際情況設置如下指令
lua_max_pending_timers 1024;? #最大等待任務數(shù)
lua_max_running_timers 256;??? #最大同時運行任務數(shù)


3)lua_package_path

語法:lua_package_path <lua-style-path-str>
默認:由lua的環(huán)境變量決定
適用上下文:http
設置lua代碼的尋找目錄。
例如:lua_package_path "/opt/nginx/conf/www/?.lua;;";

轉(zhuǎn)載于:https://www.cnblogs.com/reblue520/p/11446328.html

總結(jié)

以上是生活随笔為你收集整理的openresty开发系列32--openresty执行流程之1初始化阶段的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。