Nginx Docker 容器白名单配置操作总结
https://chat.deepseek.com/share/rwuvdw76meydyzbpmc
Nginx Docker 容器白名单配置操作总结
一、背景信息
- 容器名称:
ry-mes-font-service-1.1 - 服务:Nginx(官方镜像)
- 配置文件容器内路径:
/etc/nginx/conf.d/default.conf - 配置文件宿主机路径:
/home/wangh/mes_font/default.conf - 挂载方式:
-v /home/wangh/mes_font/default.conf:/etc/nginx/conf.d/default.conf - 需求:在 Nginx 的
location /块中新增 IP 白名单,允许10.204.52.41、10.66.17.17、10.66.17.108访问,其他 IP 全部拒绝。
二、完整操作流程
步骤1:查看当前配置(确认现状)
# 查看 conf.d 目录
docker exec ry-mes-font-service-1.1 ls -la /etc/nginx/conf.d/
# 查看现有 default.conf 内容
docker exec ry-mes-font-service-1.1 cat /etc/nginx/conf.d/default.conf
步骤2:修改宿主机上的配置文件
使用 vim 编辑宿主机挂载的源文件:
vim /home/wangh/mes_font/default.conf
具体编辑操作:
- 按
i进入插入模式 - 使用方向键移动光标到
deny all;行的正上方 - 按回车换行,依次输入以下内容(每行一条):
allow 10.204.52.41; allow 10.66.17.17; allow 10.66.17.108; - 按
Esc退出插入模式 - 输入
:wq并回车,保存并退出 vim
步骤3:尝试热加载(未生效,作为记录)
docker exec ry-mes-font-service-1.1 nginx -s reload
终端输出提示:
2026/05/19 01:40:15 [notice] 137#137: signal process started
此时通过以下命令验证,发现新规则未出现:
docker exec ry-mes-font-service-1.1 cat /etc/nginx/conf.d/default.conf | grep -B 5 "deny all"
步骤4:重启容器(使配置生效)
docker restart ry-mes-font-service-1.1
步骤5:验证配置已生效
docker exec ry-mes-font-service-1.1 cat /etc/nginx/conf.d/default.conf | grep -B 5 "deny all"
成功输出示例:
allow 10.202.16.115;
allow 10.202.16.194;
allow 10.204.52.41;
allow 10.66.17.17;
allow 10.66.17.108;
deny all;
至此,白名单配置成功生效。
三、问题分析与说明
1. 为什么 nginx -s reload 热加载未生效?
- 直接原因:宿主机上使用 vim 编辑并保存文件时,vim 默认采用“删除原文件 → 创建新文件”的方式,导致文件的 inode(索引节点)发生改变。
- 深层原因:容器内的 Nginx 进程通过挂载卷持有旧文件的 inode 句柄。执行
nginx -s reload时,Nginx 虽重新读取配置,但仍指向已被删除的旧文件缓存,因此新规则未能加载。 - 解决方式:重启容器(
docker restart)会彻底销毁旧进程并创建新进程,新进程重新打开挂载文件,获取最新内容。
2. 其他注意事项
- grep 验证技巧:使用
grep -B 5 "deny all"可以查看deny all之前的 5 行内容,避免因搜索词不完全匹配导致的误判(例如10.204.52无法匹配10.204.52.41)。 - vim 交换文件警告:如果之前 vim 异常退出,再次打开时会提示
.swp文件存在。处理方法:按Q退出警告界面,然后执行rm /home/wangh/mes_font/.default.conf.swp删除交换文件。
四、推荐的最佳实践(避免重启容器)
方法一:进入容器内部修改配置(最可靠)
# 1. 进入容器终端
docker exec -it ry-mes-font-service-1.1 /bin/bash
# 2. 安装 vim(官方 Nginx 镜像默认没有编辑器)
apt-get update && apt-get install -y vim -y
# 3. 编辑配置文件
vim /etc/nginx/conf.d/default.conf
# 4. 检查语法
nginx -t
# 5. 热加载
nginx -s reload
# 6. 退出容器
exit
优点:无 inode 变化问题,nginx -s reload 一定生效,无需重启容器。
方法二:宿主机修改但保持 inode 不变(使用重定向覆盖)
# 复制一份临时文件
cp /home/wangh/mes_font/default.conf /home/wangh/mes_font/default.conf.new
# 编辑临时文件
vim /home/wangh/mes_font/default.conf.new
# 用重定向覆盖原文件(inode 保持不变)
cat /home/wangh/mes_font/default.conf.new > /home/wangh/mes_font/default.conf
# 热加载
docker exec ry-mes-font-service-1.1 nginx -s reload
五、常用验证命令汇总
| 目的 | 命令 |
|---|---|
查看完整 location / 块 |
docker exec ry-mes-font-service-1.1 cat /etc/nginx/conf.d/default.conf | grep -A 20 "location /" |
| 查看白名单区域(deny all 前) | docker exec ry-mes-font-service-1.1 cat /etc/nginx/conf.d/default.conf | grep -B 10 "deny all" |
| 搜索特定 IP 或网段 | docker exec ry-mes-font-service-1.1 cat /etc/nginx/conf.d/default.conf | grep "10.204.52." |
| 检查 Nginx 语法 | docker exec ry-mes-font-service-1.1 nginx -t |
| 平滑重载配置 | docker exec ry-mes-font-service-1.1 nginx -s reload |
六、总结要点
- 修改挂载的配置文件后,如果
nginx -s reload不生效,请重启容器:docker restart <容器名>。 - 生产环境推荐进入容器内部修改,避免 reload 失效问题。
- 验证配置时使用
grep -B查看上下文,避免因搜索词不完整造成误判。 - vim 编辑时正常保存退出,如遇
.swp残留,删除即可。
本次操作最终成功为 Nginx 添加了所需的白名单规则,服务正常运行。
浙公网安备 33010602011771号