初始化阶段

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模块:

init_by_lua_block {
  cjson = require "cjson"
}

server {
  listen 80; 
  
  location = /api {
    content_by_lua_block {
      ngx.say(cjson.encode({dog = 5, cat = 6}))
    }
  }
}

从这段配置代码,我们可以看出,其实这个指令就是初始化一些lua的全局变量,以便后续的代码使用。

初始化lua_shared_dict共享数据:

lua_shared_dict的内容不会在nginx reload时被清除。所以如果你不想在init_by_lua中重复初始化共享数据, 那么你需要在你的共享内存中设置一个标志位并在init_by_lua中进行检查。

因为这个阶段的lua代码是在nginx forks出任何worker进程之前运行, 数据和代码的加载将享受由操作系统提供的copy-on-write的特性,从而节约了大量的内存。 不要在这个阶段初始化你的私有lua全局变量,因为使用lua全局变量会照成性能损失, 并且可能导致全局命名空间被污染。

这个阶段只支持一些小的LUA Nginx API设置:ngx.log和print、ngx.shared.DICT;

2)init_worker_by_lua

语法:

语境:http

阶段:starting-worker

在每个nginx worker进程启动时调用指定的lua代码。

用于启动一些定时任务,比如心跳检查,定时拉取服务器配置等等;此处的任务是跟Worker进程数量有关系的, 比如有2个Worker进程那么就会启动两个完全一样的定时任务。

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

b、init_worker.lua

ngx.timer.at:延时调用相应的回调方法;ngx.timer.at(秒单位延时,回调函数,回调函数的参数列表); 可以将延时设置为0即得到一个立即执行的任务,任务不会在当前请求中执行不会阻塞当前请求, 而是在一个轻量级线程中执行。

另外根据实际情况设置如下指令

3)lua_package_path

语法:

默认:由lua的环境变量决定

适用上下文:http 设置lua代码的寻找目录。

例如:lua_package_path "/opt/nginx/conf/www/?.lua;;";

Last updated

Was this helpful?