如何在Nginx中实现动态修改配置文件
Nginx 中实现动态修改配置文件(如调整反向代理、限流、过滤规则等)且无需重启服务,核心思路是「配置解耦 + 热加载 + 自动化推送」—— 把可变配置抽离到独立文件,通过脚本 / 配置中心修改后,用
nginx -s reload 热加载生效(不中断现有连接)。以下是 3 种主流实现方案,从简单到企业级,覆盖不同场景需求。核心前提
Nginx 动态修改配置的关键原则:
- 主配置不变:将可变逻辑(如 IP 封禁、路径转发)拆到独立文件,主配置通过
include引入; - 热加载而非重启:
nginx -s reload会启动新 worker 进程处理新请求,老 worker 处理完现有连接后退出,业务无感知; - 语法校验前置:修改配置后先执行
nginx -t验证语法,避免热加载失败导致 Nginx 不可用。
方案 1:基础方案(手动修改 + 热加载)
适合小型应用 / 测试环境,手动修改独立配置文件,执行热加载命令生效,零依赖、易操作。
步骤 1:拆分 Nginx 配置(核心:解耦可变配置)
1.1 主配置(nginx.conf)—— 仅保留固定逻辑
nginx
user nginx;
worker_processes auto;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 引入可变配置文件(核心:把需要动态修改的内容放在这里)
include /etc/nginx/conf.d/dynamic/*.conf;
server {
listen 80;
server_name localhost;
# 固定逻辑:转发请求到后端(不修改)
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
1.2 动态配置文件(/etc/nginx/conf.d/dynamic/filter.conf)—— 存放可变规则
nginx
# 示例:动态 IP 封禁规则
map $remote_addr $blocked_ip {
default 0;
192.168.1.100 1; # 可变:封禁的 IP
10.0.0.5 1;
}
# 示例:动态限流规则
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; # 可变:限流频率
limit_req zone=api burst=20 nodelay;
步骤 2:动态修改配置 + 热加载
2.1 手动修改动态配置文件
bash
运行
# 编辑 filter.conf,新增封禁 IP 或调整限流频率
vi /etc/nginx/conf.d/dynamic/filter.conf
2.2 验证语法 + 热加载(关键:避免配置错误)
bash
运行
# 1. 校验配置语法(必须先做)
nginx -t
# 2. 热加载配置(生效新规则,不中断服务)
nginx -s reload
核心特点
- ✅ 优点:零依赖、操作简单、学习成本低;
- ❌ 缺点:手动操作、不适合集群、规则变更需登录服务器;
- 🎯 适用:测试环境 / 小型单机应用。
方案 2:进阶方案(脚本 + 配置中心自动更新)
适合中小型集群,通过脚本定时从配置中心(Nacos/Apollo)拉取最新配置,自动更新文件并热加载,实现规则「半自动化」推送。
步骤 1:配置中心存储动态配置(以 Nacos 为例)
- 登录 Nacos 控制台,创建配置:
- Data ID:
nginx_dynamic.conf - Group:
DEFAULT_GROUP - 配置内容(与 filter.conf 一致):
nginx
map $remote_addr $blocked_ip { default 0; 192.168.1.100 1; 172.16.0.8 1; # 新增封禁 IP } limit_req_zone $binary_remote_addr zone=api:10m rate=20r/s; # 调整限流频率
- Data ID:
步骤 2:编写自动更新脚本(拉取配置 + 热加载)
创建
update_nginx_config.sh,实现「拉取配置 → 对比变更 → 验证语法 → 热加载」:bash
运行
#!/bin/bash
# 配置中心地址
NACOS_URL="http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nginx_dynamic.conf&group=DEFAULT_GROUP"
# Nginx 动态配置文件路径
NGINX_DYNAMIC_CONF="/etc/nginx/conf.d/dynamic/filter.conf"
# 临时文件
TMP_CONF="/tmp/nginx_dynamic.tmp"
# 1. 从 Nacos 拉取最新配置
curl -s -o $TMP_CONF $NACOS_URL
# 2. 对比配置是否变更(避免无意义热加载)
if diff $TMP_CONF $NGINX_DYNAMIC_CONF > /dev/null; then
echo "$(date):配置未变更,无需更新" >> /var/log/nginx/config_update.log
rm -f $TMP_CONF
exit 0
fi
# 3. 替换动态配置文件
cp $TMP_CONF $NGINX_DYNAMIC_CONF
rm -f $TMP_CONF
# 4. 验证 Nginx 配置语法
if ! nginx -t; then
echo "$(date):配置语法错误,热加载失败" >> /var/log/nginx/config_update.log
exit 1
fi
# 5. 热加载配置
nginx -s reload
echo "$(date):配置更新并热加载成功" >> /var/log/nginx/config_update.log
步骤 3:设置定时任务(自动执行脚本)
通过
crontab 定时拉取配置(如每 10 秒执行一次),实现规则自动同步:bash
运行
# 编辑 crontab
crontab -e
# 添加定时任务(每 10 秒执行一次)
*/10 * * * * /bin/bash /usr/local/bin/update_nginx_config.sh
核心特点
- ✅ 优点:规则集中管理、自动化更新、适配集群(所有 Nginx 节点拉取同一配置);
- ❌ 缺点:规则生效有延迟(取决于定时频率)、仅支持静态配置;
- 🎯 适用:中小型集群、需统一管理规则的场景。
方案 3:企业级方案(OpenResty + Lua + 动态配置中心)
适合高并发 / 复杂场景,基于 OpenResty(Nginx + Lua)实现配置「实时生效」(无需热加载),支持动态调整限流、转发、过滤等规则。
前置准备
安装 OpenResty(集成 Lua 解释器的 Nginx):
bash
运行
# CentOS
yum install openresty -y
# Ubuntu
apt install openresty -y
步骤 1:Nginx 配置(集成 Lua 脚本)
nginx
http {
# 加载 Lua 模块
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
# 共享字典:缓存动态配置(避免频繁查 Redis)
lua_shared_dict nginx_config 10m;
server {
listen 80;
server_name localhost;
# 初始化:从 Redis 加载配置到共享字典(每 5 秒刷新)
init_worker_by_lua_block {
local config = require("dynamic_config")
config.load_config() -- 启动时加载
config.auto_refresh(5) -- 每 5 秒自动刷新
}
# 执行动态限流/过滤逻辑
access_by_lua_block {
local config = require("dynamic_config")
local limit_rate = config.get("limit_rate") -- 获取动态限流频率
-- 执行限流逻辑(示例)
local limit_req = require "resty.limit.req"
local lim, err = limit_req.new("api", limit_rate)
-- ... 限流逻辑 ...
}
# 转发请求到后端
location / {
proxy_pass http://127.0.0.1:8080;
}
}
}
步骤 2:Lua 脚本(实时拉取配置)
创建
/usr/local/openresty/lualib/dynamic_config.lua,从 Redis 实时拉取配置并缓存:lua
local redis = require "resty.redis"
local shared_dict = ngx.shared.nginx_config
-- 从 Redis 加载配置
function _M.load_config()
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.log(ngx.ERR, "Redis 连接失败:", err)
return
end
-- 拉取限流频率、封禁 IP 等配置
local limit_rate = red:get("nginx:limit_rate")
local blocked_ips = red:smembers("nginx:blocked_ips")
-- 存入共享字典(缓存)
shared_dict:set("limit_rate", limit_rate or "10r/s")
shared_dict:set("blocked_ips", cjson.encode(blocked_ips))
red:close()
end
-- 自动刷新配置
function _M.auto_refresh(interval)
local delay = interval * 1000
local handler
handler = function(premature)
if premature then return end
_M.load_config()
-- 定时刷新
local ok, err = ngx.timer.at(delay, handler)
if not ok then
ngx.log(ngx.ERR, "定时器创建失败:", err)
end
end
-- 启动定时器
local ok, err = ngx.timer.at(delay, handler)
if not ok then
ngx.log(ngx.ERR, "定时器创建失败:", err)
end
end
-- 获取配置
function _M.get(key)
return shared_dict:get(key)
end
return _M
步骤 3:动态更新 Redis 配置(实时生效)
通过 Redis 命令 / 接口修改配置,Lua 脚本会自动刷新缓存,无需热加载 Nginx:
bash
运行
# 1. 修改限流频率(实时生效)
redis-cli SET nginx:limit_rate "20r/s"
# 2. 新增封禁 IP
redis-cli SADD nginx:blocked_ips 192.168.1.100
核心特点
- ✅ 优点:配置实时生效(无延迟)、支持复杂逻辑、高性能(Lua 原生执行);
- ❌ 缺点:需学习 Lua 语法、依赖 OpenResty/Redis;
- 🎯 适用:高并发场景、需实时调整规则的核心业务。
关键注意事项
1. 避免配置错误导致服务不可用
- 所有修改前必须执行
nginx -t校验语法; - 动态配置文件建议备份,出错时可快速回滚:
bash运行
cp /etc/nginx/conf.d/dynamic/filter.conf /etc/nginx/conf.d/dynamic/filter.conf.bak
2. 集群环境配置同步
- 方案 2/3 中,确保所有 Nginx 节点拉取同一配置中心 / Redis 的规则;
- 避免部分节点配置不一致导致业务异常。
3. 性能优化
- 方案 3 中,通过
lua_shared_dict缓存配置,减少 Redis 访问次数; - 定时刷新频率不宜过高(如 5-10 秒),避免频繁查 Redis。
4. 配置回滚
- 保留配置变更日志,出错时可快速回滚到历史版本:
bash运行
# 回滚到备份配置 cp /etc/nginx/conf.d/dynamic/filter.conf.bak /etc/nginx/conf.d/dynamic/filter.conf nginx -t && nginx -s reload
总结
Nginx 动态修改配置文件的核心方案:
表格
| 方案 | 实现方式 | 生效延迟 | 适用场景 | 核心优势 |
|---|---|---|---|---|
| 手动修改 + 热加载 | 编辑文件 + nginx reload | 秒级 | 测试环境 / 小型单机 | 简单、无依赖 |
| 脚本 + 配置中心 | 定时拉取 + 自动热加载 | 定时频率(如 10 秒) | 中小型集群 | 规则集中管理、自动化 |
| OpenResty + Lua + Redis | 实时拉取配置 + 缓存 | 实时 | 高并发 / 复杂场景 | 无延迟、支持复杂逻辑 |
选择建议:
- 快速验证 / 小场景:选方案 1;
- 中小型集群 / 自动化:选方案 2;
- 高并发 / 实时调整:选方案 3。
所有方案的核心是「解耦可变配置 + 热加载 / 实时拉取」,确保配置变更不中断业务,这也是生产环境中 Nginx 动态配置的核心原则。
阅读剩余
版权声明:
作者:SE_Yang
链接:https://www.cnesa.cn/10659.html
文章版权归作者所有,未经允许请勿转载。
THE END
阿里云ECS服务器 - 限时特惠活动
云服务器爆款直降90%
新客首单¥68起 | 人人可享99元套餐,续费同价 | u2a指定配置低至2.5折1年,立即选购享更多福利!
新客首单¥68起
人人可享99元套餐
弹性计费
7x24小时售后