nginx虽不支持直接嵌入脚本,但可通过openresty(lua)、map模块、配置模板化及动态模块四种方式实现可编程扩展:openresty重构nginx支持全生命周期lua逻辑;map指令实现轻量条件映射;外部工具模板生成conf;nginx plus或第三方模块支持运行时upstream动态更新。

Nginx 本身不支持传统意义上的“可编程扩展”(如 Python 或 JavaScript 脚本直接嵌入配置),但可通过多种成熟、稳定的方式实现配置的动态化、参数化与逻辑增强,核心思路是:**把配置生成或行为控制从静态文本转向程序驱动**。
使用 Nginx Plus 的原生脚本能力(Lua + OpenResty)
OpenResty 是基于 Nginx 的高性能 Web 平台,集成了 LuaJIT 和大量 Lua 模块,允许在 Nginx 请求生命周期各阶段(rewrite、access、content 等)执行 Lua 代码,真正实现“可编程”。它不是插件,而是重构版 Nginx,生产环境广泛使用。
- 安装 OpenResty(替代或并行部署标准 Nginx)
- 在配置中用
content_by_lua_block、access_by_lua_file等指令嵌入逻辑 - 示例:根据请求头动态选择上游服务
location /api/ {
access_by_lua_block {
local version = ngx.req.get_headers()["X-Api-Version"] or "v1"
ngx.var.upstream_group = "backend_" .. version
}
proxy_pass http://$upstream_group;
}
通过变量 + map 模块实现条件路由与参数化
标准 Nginx 自带 map 指令,可在运行时将输入(如 host、header、arg)映射为变量值,配合 if(谨慎使用)或直接用于 proxy_pass、root 等指令,实现轻量级逻辑分支。
-
map必须定义在 http 块中,不可嵌套,但支持正则和默认值 - 避免在 location 中滥用
if,优先用 map + 变量组合 - 示例:按域名自动匹配静态资源路径
map $host $static_root {
default "/var/www/default";
~^app\.(.+)$ "/var/www/$1";
}
server {
root $static_root;
}
配置模板化:用外部工具生成 conf 文件
将 Nginx 配置视为“输出”,而非“源码”。用 Jinja2(Python)、ERB(Ruby)、Helm(K8s)、Ansible 或 even bash + sed/awk,根据环境变量、服务发现结果或 API 数据动态渲染 conf 文件,再 reload Nginx。
- 适合 CI/CD 场景:发布新服务时自动生成 upstream 和 server 块
- 结合 Consul、etcd 或 Kubernetes Endpoints 实现服务自动注册
- 关键:确保生成后语法校验(
nginx -t)再 reload,避免配置错误中断服务
利用 Nginx 的动态模块与 API(Nginx Plus 或开源替代)
Nginx Plus 提供 REST API,支持运行时修改 upstream 成员、权重、健康状态;开源生态中,nginx-upsync-module(已归档但仍有项目维护)或 nginx-stream-upsync-module 可对接 ZooKeeper/Consul,实现 upstream 动态同步。
- 无需 reload 即可更新后端列表,适用于高频扩缩容场景
- 注意:动态模块需编译进 Nginx,非所有发行版默认包含
- 搭配 Prometheus + nginx-vts-exporter 可实现可观测性闭环











