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

108 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: session-20260614-2
description: 2026-06-14 第2次会话 — 转发规则编辑弹窗新增"内容压缩"和"日志"两个Tab页
metadata:
type: session
date: 2026-06-14
sessionNumber: 2
startTime: 2026-06-14T22:30:00+08:00
endTime: 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
## 待处理
- [x] MySQL 数据库迁移已完成4列添加成功gzip_enabled/gzip_types/gzip_comp_level/gzip_min_length
- [x] 全局gzip已从nginx.conf移除
- [ ] 用户部署Java后端和Vue前端
- [ ] 验证完整前端→后端→Python API链路