技术栈
Docker 容器化部署,前后端一体架构
PHP PHP 7.4 + Typecho 1.3.0
轻量级博客引擎,Markdown 编辑,Joe 再续前缘版主题Apache Apache 2.4.54
mod_rewrite / mod_expires / mod_deflate / mod_headersMySQL MySQL 8.4
InnoDB 引擎,utf8mb4 字符集Docker Docker + Compose
双容器编排,健康检查,资源限制系统架构
Docker Compose 双容器编排,数据持久化
用户层
🌐
浏览器
Chrome / Safari / Edge
📱
移动端
响应式适配
▼
网络层
🚪
Port 8088
Host → Container 80
📦
Gzip 压缩
75-81% 压缩率
▼
应用层
⚡
OPcache
128MB / 4000 文件
📄
PageCache
文件缓存 / 24h TTL
📝
Typecho
PHP 7.4 / Joe Theme
💾
Static Cache
mod_expires / ETag 关闭
▼
数据层
🗄️
MySQL 8.4
InnoDB / Buffer Pool 256MB
💿
Docker Volume
db_data 持久化
部署配置
docker-compose.yml 关键参数一览
| 服务 | 配置项 | 值 | 说明 |
|---|---|---|---|
| typecho | ports | 8088:80 | 宿主机 8088 映射容器 80 |
| volumes | ./typecho:/var/www/html | 代码目录挂载,热更新 | |
| deploy.resources | memory: 512M | 容器内存上限 | |
| db | image | mysql:8.4 | MySQL 8.4 官方镜像 |
| ports | 3307:3306 | 宿主机 3307 映射(避免冲突) | |
| command | --innodb-buffer-pool-size=256M | InnoDB 缓冲池扩容 | |
| command | --max-connections=100 | 最大连接数 | |
| healthcheck | mysqladmin ping | 5s 间隔健康检查 |
性能优化清单
6 项优化覆盖 PHP / Apache / MySQL / Docker 四层
| # | 优化项 | 层级 | 关键参数 | 效果 |
|---|---|---|---|---|
| 1 | OPcache | PHP | 128MB / 4000 文件 / 2s revalidate | 消除 PHP 脚本编译开销,每个请求节省 ~20-40ms |
| 2 | mod_deflate | Apache | Gzip 压缩 HTML / CSS / JS / SVG | 传输体积减少 75-81% |
| 3 | mod_expires | Apache | CSS/JS 1月 / 图片 1年 / HTML 2天 | 回访用户静态资源 零请求 |
| 4 | mod_headers | Apache | ETag 关闭 / immutable Cache-Control | 消除条件请求,减少 304 往返 |
| 5 | MySQL 调优 | 数据库 | Buffer Pool 256MB / max_connections=100 | 热数据内存命中,减少磁盘 I/O |
| 6 | PageCache | 应用 | 文件缓存 / 24h TTL / 跳过登录用户 | 缓存命中响应 ~59ms,提速 58% |
Dockerfile — 镜像构建
基于 php:7.4-apache,添加 PHP 扩展与 OPcache 配置
FROM php:7.4-apache RUN a2enmod rewrite expires headers RUN apt-get update && apt-get install -y \ libzip-dev libpq-dev libonig-dev \ && docker-php-ext-install -j$(nproc) \ pdo_mysql pdo_pgsql mysqli mbstring zip opcache \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini
测试方法与数据
对照组 vs 实验组 A/B 测试,所有测试在同一 Docker 环境执行
以下数据由本地 Agent 自动化脚本在 Docker 环境内自动采集(curl 计时 + docker exec 验证),测试日期:2026-05,仅供参考。
测试环境
测试工具
本地 Agent 自动化脚本 curl + docker exec
本地 Agent 自动化脚本 curl + docker exec
采样策略
每页面连续 3 次请求取平均
每页面连续 3 次请求取平均
基准线
禁用 PageCache,保留 OPcache + Apache 优化
禁用 PageCache,保留 OPcache + Apache 优化
实验组
启用 PageCache,缓存命中
启用 PageCache,缓存命中
页面响应时间对比
首页
/↓ 58%
AI 分类
/category/ai/↓ 48%
架构设计
/category/架构设计/↓ 26%
Gzip 压缩效果
| 资源 | 原始大小 | Gzip 后 | 压缩率 | 节省 |
|---|---|---|---|---|
| 首页 HTML | 49,020 bytes | 12,158 bytes | 75% | -36.9 KB |
| joe.index.css | 18,563 bytes | 3,562 bytes | 81% | -15.0 KB |
关键指标一览
~59ms
缓存首页响应
75%
Gzip 平均压缩率
256MB
MySQL Buffer Pool
2 容器
Docker 编排
24h
页面缓存 TTL
缓存验证方法
以下命令可在生产环境中复现测试结果
1. 验证 OPcache 状态
curl -s http://localhost:8088/opcheck.php | grep "opcache.enable"
确认 opcache.enable = On,memory_consumption = 128
2. 验证 Gzip 压缩
curl -sI -H "Accept-Encoding: gzip" http://localhost:8088/ | grep Content-Encoding
返回 Content-Encoding: gzip 表示压缩生效
3. 验证浏览器缓存策略
curl -sI http://localhost:8088/ | grep Cache-Control
返回 Cache-Control: max-age=172800 表示 2 天浏览器缓存
4. 验证 PageCache 生效
docker exec myblog-typecho find /var/www/html/usr/cache/pagecache -name "*.cache" | wc -l
访问页面后统计缓存文件数量,>0 即生效
5. 验证 MySQL Buffer Pool
docker exec myblog-mysql mysql -uroot -ptypecho123 -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
返回 268435456 (= 256MB) 表示配置生效