Files
nginxserver/memory/session-20260614-2.md
2026-07-16 13:03:11 +08:00

5.6 KiB
Raw Blame History

name, description, metadata
name description metadata
session-20260614-2 2026-06-14 第2次会话 — 转发规则编辑弹窗新增"内容压缩"和"日志"两个Tab页
type date sessionNumber startTime endTime
session 2026-06-14 2 2026-06-14T22:30:00+08:00 2026-06-15T00:40:00+08:00

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/gzipMinLength
    • nginx_service.py — parse_gzip_config()/set_gzip_config() 方法
    • app.py — GET/PUT /api/nginx/rules/<domain>/gzip
    • PythonApiClient.java — getGzipConfig/updateGzipConfig
    • ForwardingRuleService.java — getGzipConfig/updateGzipConfig同步DB+Nginx
    • ForwardingRuleController.java — GET/PUT /{id}/gzip
    • nginxApi.js — getRuleGzip/updateRuleGzip
    • NginxForwarding.vue — 内容压缩Tabel-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=N
    • PythonApiClient.java — getDomainLogs
    • ForwardingRuleService.java — getDomainLogs
    • ForwardingRuleController.java — GET /{id}/logs
    • nginxApi.js — getRuleLogs
    • NginxForwarding.vue — 日志Tabel-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

  1. 转发信息 — 始终可见
  2. 配置文件 — 仅编辑模式
  3. SSL — 仅编辑+HTTPS模式
  4. 内容压缩 — 仅编辑模式(新增)
  5. 日志 — 仅编辑模式(新增)

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 APIgzip读写均正常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链路