Ethan's Tech Blog

基于 Typecho 的个人技术博客 — 系统架构、性能优化与测试报告

持续更新中 技术 + 架构 Docker 部署 更新至 2026-05

技术栈

Docker 容器化部署,前后端一体架构

PHP PHP 7.4 + Typecho 1.3.0

轻量级博客引擎,Markdown 编辑,Joe 再续前缘版主题

Apache Apache 2.4.54

mod_rewrite / mod_expires / mod_deflate / mod_headers

MySQL 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 关键参数一览

服务配置项说明
typechoports8088:80宿主机 8088 映射容器 80
volumes./typecho:/var/www/html代码目录挂载,热更新
deploy.resourcesmemory: 512M容器内存上限
dbimagemysql:8.4MySQL 8.4 官方镜像
ports3307:3306宿主机 3307 映射(避免冲突)
command--innodb-buffer-pool-size=256MInnoDB 缓冲池扩容
command--max-connections=100最大连接数
healthcheckmysqladmin ping5s 间隔健康检查

性能优化清单

6 项优化覆盖 PHP / Apache / MySQL / Docker 四层

#优化项层级关键参数效果
1OPcachePHP 128MB / 4000 文件 / 2s revalidate 消除 PHP 脚本编译开销,每个请求节省 ~20-40ms
2mod_deflateApache Gzip 压缩 HTML / CSS / JS / SVG 传输体积减少 75-81%
3mod_expiresApache CSS/JS 1月 / 图片 1年 / HTML 2天 回访用户静态资源 零请求
4mod_headersApache ETag 关闭 / immutable Cache-Control 消除条件请求,减少 304 往返
5MySQL 调优数据库 Buffer Pool 256MB / max_connections=100 热数据内存命中,减少磁盘 I/O
6PageCache应用 文件缓存 / 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
采样策略
每页面连续 3 次请求取平均
基准线
禁用 PageCache,保留 OPcache + Apache 优化
实验组
启用 PageCache,缓存命中

页面响应时间对比

首页 /
基准 140ms
缓存 59ms
↓ 58%
AI 分类 /category/ai/
基准 130ms
缓存 67ms
↓ 48%
架构设计 /category/架构设计/
基准 81ms
缓存 ~60ms
↓ 26%

Gzip 压缩效果

资源原始大小Gzip 后压缩率节省
首页 HTML49,020 bytes12,158 bytes75%-36.9 KB
joe.index.css18,563 bytes3,562 bytes81%-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) 表示配置生效