5.6 KiB
5.6 KiB
name, description, metadata
| name | description | metadata | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| session-20260614-2 | 2026-06-14 第2次会话 — 转发规则编辑弹窗新增"内容压缩"和"日志"两个Tab页 |
|
2026-06-14 第2次会话
会话摘要
在Nginx转发管理编辑弹窗中新增了"内容压缩"(仿宝塔gzip配置)和"日志"(响应日志/错误日志)两个Tab页。全栈实现:数据库 → Python API → Java后端 → Vue前端。Python API已部署到10.1.1.160并测试通过。
关键操作
1. 新增"内容压缩"Tab(第4个标签页)
- 做了什么: 在编辑弹窗新增"内容压缩"Tab,包含:gzip开关、12种MIME类型复选框(与宝塔一致)、压缩级别(1-9)、最小压缩长度(支持k/m单位)
- 涉及文件:
sql/gzip_migration.sql— 4个新字段ForwardingRule.java— gzipEnabled/gzipTypes/gzipCompLevel/gzipMinLengthnginx_service.py— parse_gzip_config()/set_gzip_config() 方法app.py— GET/PUT/api/nginx/rules/<domain>/gzipPythonApiClient.java— getGzipConfig/updateGzipConfigForwardingRuleService.java— getGzipConfig/updateGzipConfig(同步DB+Nginx)ForwardingRuleController.java— GET/PUT/{id}/gzipnginxApi.js— getRuleGzip/updateRuleGzipNginxForwarding.vue— 内容压缩Tab(el-switch + el-checkbox-group + el-select)
- 实现方式: Python API直接修改Nginx配置文件中的gzip指令(正则删除旧的→插入新的→nginx -t→reload,失败自动回滚)
- 结果: 10.1.1.160已验证,gzip配置读写正常,nginx语法检查通过
2. 新增"日志"Tab(第5个标签页)
- 做了什么: 新增"日志"Tab,通过el-radio-button切换"响应日志"(access.log)/"错误日志"(error.log),支持最近50/100/200/500行
- 涉及文件:
nginx_service.py— get_domain_logs() 方法(tail + grep过滤域名)app.py— GET/api/nginx/rules/<domain>/logs?lines=NPythonApiClient.java— getDomainLogsForwardingRuleService.java— getDomainLogsForwardingRuleController.java— GET/{id}/logsnginxApi.js— getRuleLogsNginxForwarding.vue— 日志Tab(el-radio-group + el-textarea只读)
- 结果: 10.1.1.160已验证,日志读取正常
3. Bug修复
- 问题: set_gzip_config首次插入后,再次更新时旧的
# 内容压缩(gzip)注释不会被删除,导致重复 - 修复: 在删除正则中增加对
# 内容压缩注释行的清理 - 结果: 已修复并重新部署,确认干净
涉及文件清单
| 文件 | 操作 | 说明 |
|---|---|---|
sql/gzip_migration.sql |
新增 | 安全迁移脚本(存储过程检查列是否存在) |
ForwardingRule.java |
改 | 新增4个gzip字段 |
services/nginx_service.py |
改 | 新增parse_gzip_config/set_gzip_config/get_domain_logs |
app.py |
改 | 新增gzip GET/PUT + logs GET 端点 |
PythonApiClient.java |
改 | 新增getGzipConfig/updateGzipConfig/getDomainLogs |
ForwardingRuleService.java |
改 | 新增gzip业务方法(同步DB+Nginx)+ logs方法 |
ForwardingRuleController.java |
改 | 新增 GET/PUT /{id}/gzip + GET /{id}/logs |
api/nginxApi.js |
改 | 新增getRuleGzip/updateRuleGzip/getRuleLogs |
views/NginxForwarding.vue |
改 | 新增内容压缩Tab + 日志Tab |
重要信息
部署状态
- Python API (10.1.1.160): 已部署,已验证gzip和logs端点 ✓
- 备份:
/opt/nginx-api-backup-20260614-224351 - 数据库迁移: sql/gzip_migration.sql 待执行(MySQL 10.1.1.122)
- Java后端: 编译通过,待用户部署
- Vue前端: 编译通过(npm build 3.85s),待用户部署
编辑弹窗Tab结构(现在共5个Tab)
- 转发信息 — 始终可见
- 配置文件 — 仅编辑模式
- SSL — 仅编辑+HTTPS模式
- 内容压缩 — 仅编辑模式(新增)
- 日志 — 仅编辑模式(新增)
gzip默认值
- 开关: 关闭
- MIME类型: 12种(与宝塔一致)
- 压缩级别: 6
- 最小长度: 1000(字节)
4. 全局gzip决策变更
- 做了什么: 用户要求去掉nginx.conf全局gzip,让每个域名通过页面独立控制。后又改为保留全局、隐藏Tab,最终又改回去掉全局、保留Tab
- 最终结果: 全局gzip已从 /etc/nginx/nginx.conf 移除(备份: nginx.conf.bak-20260615-002300),"内容压缩"Tab保留
v-if="isEditing"
5. 前端Bug修复 — gzipLoadedOnce未重置
- 问题: 开启gzip保存后关闭弹窗再打开,开关显示"关闭"
- 根因:
resetConfigState()重置了表单数据但没重置gzipLoadedOnce = false,导致onTabChange跳过loadGzipConfig() - 修复: 在
resetConfigState()添加gzipLoadedOnce = false,同时简化onTabChange条件判断 - 结果: 每次打开弹窗都重新从服务器加载gzip配置
6. 未部署导致的"配置文件无gzip"问题
- 现象: 页面上开启压缩后,配置文件Tab看不到gzip指令
- 根因: Java后端未部署更新版(旧版无 /{id}/gzip 端点),PUT请求到不了Python API
- 验证: 直接在10.1.1.160上curl测试Python API,gzip读写均正常,nginx -t通过
- 解决: 需用户部署Java后端jar + Vue前端dist
待处理
- MySQL 数据库迁移已完成(4列添加成功:gzip_enabled/gzip_types/gzip_comp_level/gzip_min_length)
- 全局gzip已从nginx.conf移除
- 用户部署Java后端和Vue前端
- 验证完整前端→后端→Python API链路