全书目录

第五十四篇:OpenResty 完全指南 —— 可编程网关锻造厂宇宙

四、`lua-nginx-module`:真正让 Nginx 长出 Lua 机械臂的模块

2 分钟 724 字 第 939 / 962 个阅读单元

lua-nginx-module 是 OpenResty 的核心接口层。它提供三样东西:

#1. 指令入口:把 Lua 挂到 Nginx 配置里

典型形式:

  • init_by_lua_block
  • rewrite_by_lua_block
  • access_by_lua_block
  • content_by_lua_block
  • header_filter_by_lua_block
  • log_by_lua_block

这意味着:Nginx 配置文件不再只是声明式规则表,而是可以在关键工位执行 Lua 程序。

#2. ngx API:Lua 和 Nginx 世界的桥

你在 Lua 里通过 ngx 干活,比如:

  • ngx.req.get_headers()
  • ngx.var.xxx
  • ngx.say()
  • ngx.exit()
  • ngx.shared.DICT
  • ngx.location.capture()
  • ngx.timer.at()

它就像工厂中控台的操作面板。

#3. cosocket + subrequest:高并发魔法源头

这是最核心的两个武器。

#cosocket

用协程友好的方式做网络 I/O:

  • Redis
  • MySQL
  • PostgreSQL
  • HTTP
  • DNS
  • TCP/Unix Socket

#subrequest

向 Nginx 内部 location 发起非阻塞“内部子请求”。

你可以把它理解成:

  • cosocket:去厂外联系外部供应商
  • subrequest:在厂内调用其他车间协作

#一个最小示例

nginx
worker_processes auto;

events {
    worker_connections 4096;
}

http {
    lua_package_path "lua/?.lua;;";
    lua_shared_dict counters 10m;

    init_by_lua_block {
        require("bootstrap").init()
    }

    server {
        listen 8080;

        location /hello {
            content_by_lua_block {
                ngx.say("hello from openresty")
            }
        }
    }
}

lua/bootstrap.lua

lua
local _M = {}

function _M.init()
    ngx.log(ngx.NOTICE, "bootstrap loaded")
end

return _M

这个例子很小,但已经暴露出 OpenResty 的本质:
Nginx 配置负责摆工位,Lua 代码负责定义工位动作。