推荐使用OpenResty镜像,因其预集成Nginx+LuaJIT+ngx_lua及redis、json、http client等模块,开箱即用;次选Alpine手动构建;最后选源码多阶段构建以精确控制版本。

直接在官方 Nginx 镜像里加 Lua 不可行——它默认不带 ngx_lua 模块,更没有 Lua 运行时和常用扩展。集成的关键不是“装个 Lua”,而是让 Nginx 能加载并执行 Lua 代码,同时支持 Redis、JSON、HTTP 客户端等实际业务需要的模块。有三条清晰路径可选,按推荐顺序说明。
用现成的 OpenResty 镜像(最快最稳)
OpenResty 是 Nginx + LuaJIT + ngx_lua + 一整套常用模块(redis、memcached、drizzle、json、http client 等)的预编译集合,Docker 官方镜像开箱即用:
- 拉取镜像:
docker pull openresty/openresty:alpine(轻量)或:bullseye(兼容性好) - Lua 脚本默认放在
/usr/local/openresty/nginx/lua/,配置中用lua_package_path "/usr/local/openresty/nginx/lua/?.lua;;";声明路径 - 常用模块已内置:比如
resty.redis、cjson、resty.http,脚本里直接local redis = require "resty.redis"即可调用 - 无需编译、无版本冲突风险,适合 90% 的网关、鉴权、动态路由等场景
基于 Alpine 构建精简版 Nginx+Lua(可控性强)
如果你明确拒绝 OpenResty 的“全家桶”,只想最小化集成 Lua 和几个关键模块(如 redis、json),可用 Alpine 基础镜像手动构建:
- 基础镜像选
nginx:alpine,再安装lua5.1、lua5.1-dev、nginx-mod-http-lua - 启用模块需在
nginx.conf的http块中显式加载:load_module modules/ngx_http_lua_module.so; - Lua 标准库(
json、socket等)需额外安装:apk add --no-cache lua-json lua-socket - Redis 支持要靠第三方 Lua 库(如
lua-resty-redis),需手动下载.lua文件到指定目录,并在配置中设置lua_package_path - 注意:Alpine 的
musl libc可能导致某些 C 扩展不兼容,优先选纯 Lua 实现的库
从源码多阶段构建(完全自定义,适合生产)
对安全性、版本控制或模块组合有严格要求时(例如必须用 Nginx 1.30.2 + LuaJIT 2.1 + 特定版本的 lua-nginx-module),推荐多阶段构建:
- 第一阶段用
buildpack-deps:bullseye安装编译工具、PCRE、OpenSSL、LuaJIT、ngx_devel_kit、lua-nginx-module - 第二阶段用
nginx:1.30.2-slim为基础,把第一阶段编译好的模块.so文件复制进来 - 在
nginx.conf中加载模块,并配置lua_package_cpath指向 C 模块路径(如/usr/lib/lua/5.1/?.so;;) - 可同时集成
lua-resty-core、lua-resty-string、lua-resty-lock等 OpenResty 生态通用库,提升开发效率 - 最终镜像体积比 OpenResty 小 30%~40%,且所有组件版本精确可控
验证与调试要点
无论哪种方式,上线前务必验证 Lua 环境是否真正就绪:
- 进容器执行
nginx -V 2>&1 | grep -o with-http_lua_module,确认模块已编译进内核 - 写一个测试 location,用
content_by_lua_block { ngx.say("OK:", type(cjson)) }检查 JSON 库是否可加载 - 若报
module 'xxx' not found,先检查lua_package_path和lua_package_cpath路径是否拼写正确、文件权限是否为 644、路径末尾是否漏了;; - 日志中出现
lua entry thread aborted多因语法错误或超时,打开lua_code_cache off;(仅开发环境)便于实时调试


















