写在最前
之前用来养龙虾的服务器在上学期(25-26-se)停用了,闲着也是闲着,装了个 typecho 发博客,最近想起来翻新一下。
本博客的搭建思路:
| 项目 | 推荐 |
|---|---|
| 服务器 | 阿里云轻量应用服务器 |
| 配置 | 2 核 2 GB;40 GB SSD;200 Mbps |
| 架构 | x86_64 |
| 系统 | Ubuntu Server 24.04 LTS |
| Web 环境 | Nginx + PHP 8.3-FPM + MariaDB |
| 博客 | Typecho 1.3.0 |
| Mac 运维 | Terminal SSH + VS Code Remote SSH;Transmit |
| 本地写作 | MWeb + Typora + Git |
| 数学公式 | MarkdownParse + MathJax |
| 备份 | usr 备份 + 阿里云快照 |
Ubuntu 24.04 LTS 标准安全维护到 2029 年 5 月,PHP 8.3 也是它的默认 PHP-FPM 版本,兼容性比刚发布的 Ubuntu 26.04/PHP 8.5 更稳妥。Ubuntu 生命周期、Ubuntu PHP 8.3 包
先处理备案和域名
这里笔者之前已经完成域名配置。
配置阿里云防火墙和安全组
只开放:
| 端口 | 来源 |
|---|---|
| TCP 80 | 0.0.0.0/0 |
| TCP 443 | 0.0.0.0/0 |
| TCP 22 | 仅当前的公网 IP |
| TCP 3306 | 不开放 |
阿里云官方也建议 SSH 端口只允许可信 IP,80/443 才对公网开放。ECS 安全组最佳实践、轻量服务器防火墙
Mac 配置远程连接
- 创建专用 SSH 密钥
在 Mac“终端”运行:
ssh-keygen -t ed25519 -a 100 \
-f ~/.ssh/id_ed25519_aliyun_blog \
-C "mac-to-aliyun-blog"第一次使用阿里云提供的 root 密码登录:
ssh root@服务器公网IP创建日常运维用户:
adduser blogadmin
usermod -aG sudo blogadmin退出服务器,在 Mac 上把公钥传给新用户:
cat ~/.ssh/id_ed25519_aliyun_blog.pub | \
ssh root@服务器公网IP \
"install -d -m 700 -o blogadmin -g blogadmin /home/blogadmin/.ssh &&
tee /home/blogadmin/.ssh/authorized_keys >/dev/null &&
chown blogadmin:blogadmin /home/blogadmin/.ssh/authorized_keys &&
chmod 600 /home/blogadmin/.ssh/authorized_keys"测试:
ssh -i ~/.ssh/id_ed25519_aliyun_blog blogadmin@服务器公网IP确认成功后,在服务器建立:
sudo nano /etc/ssh/sshd_config.d/99-blog-hardening.conf写入:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no检查并重新加载:
sudo sshd -t
sudo systemctl reload ssh注意:一定要先在另一个终端窗口测试密钥登录,再禁用密码和 root 登录。
- 简化日常连接
编辑 ~/.ssh/config:
Host aliyun-blog
HostName 服务器公网IP
User blogadmin
IdentityFile ~/.ssh/id_ed25519_aliyun_blog
IdentitiesOnly yes
ServerAliveInterval 60以后直接:
ssh aliyun-blogmacOS 自带完整 SSH 客户端。Apple Terminal 远程连接说明
- 图形化和可视化方案(笔者这里还没有做)
- 修改服务器文件:VS Code + Remote SSH,成熟、免费、可直接打开远程目录。VS Code Remote SSH 官方指南
- 拖放主题和插件:Transmit,选择 SFTP,可直接使用现有 SSH 密钥。Transmit SFTP 密钥说明
- 纯运维:Mac Terminal 已足够。
不要使用传统 FTP,只使用 SFTP/SSH。
安装 Nginx、PHP 和数据库
连接服务器:
ssh aliyun-blog更新系统:
sudo apt update
sudo apt full-upgrade -y
sudo timedatectl set-timezone Asia/Shanghai安装环境:
sudo apt install -y \
nginx \
mariadb-server \
php8.3-fpm \
php8.3-mysql \
php8.3-curl \
php8.3-mbstring \
php8.3-xml \
php8.3-gd \
php8.3-intl \
php8.3-zip \
unzip \
curl启动并设置开机运行:
sudo systemctl enable --now nginx
sudo systemctl enable --now mariadb
sudo systemctl enable --now php8.3-fpm服务器内部再启用一层防火墙:
sudo ufw allow OpenSSH
sudo ufw allow "Nginx Full"
sudo ufw enable笔者这里使用 2 GB 服务器建议增加 1 GB Swap
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -hSwap 只是防止偶发内存峰值,不是内存的替代品。
创建 Typecho 数据库
运行 MariaDB 安全初始化:
sudo mariadb-secure-installation通常选择:
- 删除匿名用户:Yes
- 禁止 root 远程登录:Yes
- 删除测试数据库:Yes
- 重载权限:Yes
MariaDB 新版本通常使用本地 Unix Socket 管理 root,不必强行为数据库 root 设置可远程使用的密码。MariaDB 安全初始化说明
生成数据库密码:
openssl rand -base64 32把结果保存在密码管理器中,然后进入数据库:
sudo mariadb执行:
CREATE DATABASE typecho
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE USER 'typecho'@'localhost'
IDENTIFIED BY '替换为刚才生成的强密码';
GRANT ALL PRIVILEGES ON typecho.*
TO 'typecho'@'localhost';
FLUSH PRIVILEGES;
EXIT;MariaDB 只监听本机,绝对不要向公网开放 3306。
调整 PHP
编辑:
sudo nano /etc/php/8.3/fpm/php.ini搜索并调整:
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 24M
max_execution_time = 60
date.timezone = Asia/Shanghai
cgi.fix_pathinfo = 02 GB 服务器还可调整:
sudo nano /etc/php/8.3/fpm/pool.d/www.conf设置:
pm = ondemand
pm.max_children = 8
pm.process_idle_timeout = 10s
pm.max_requests = 500重启:
sudo systemctl restart php8.3-fpm下载 Typecho
截至 2026 年 9 月,Typecho 最新稳定版是 1.3.0;官方要求 PHP 7.4 以上,并支持 MariaDB、MySQL、SQLite 和 PostgreSQL。Typecho Releases、Typecho 官方要求
执行:
sudo mkdir -p /var/www/typecho
cd /tmp
curl -fL \
https://github.com/typecho/typecho/releases/latest/download/typecho.zip \
-o typecho.zip
sudo unzip typecho.zip -d /var/www/typecho检查:
ls /var/www/typecho正常应看到:
admin install usr var index.php install.php如果所有内容在 build 子目录中,则执行:
sudo cp -a /var/www/typecho/build/. /var/www/typecho/设置安全权限:
sudo mkdir -p /var/www/typecho/usr/uploads
sudo chown -R root:www-data /var/www/typecho
sudo find /var/www/typecho -type d -exec chmod 755 {} \;
sudo find /var/www/typecho -type f -exec chmod 644 {} \;
sudo chown -R www-data:www-data /var/www/typecho/usr/uploads
sudo touch /var/www/typecho/config.inc.php
sudo chown www-data:www-data /var/www/typecho/config.inc.php
sudo chmod 640 /var/www/typecho/config.inc.php只有上传目录和安装时的配置文件需要 PHP 写权限,不要图省事使用 chmod -R 777。
配置 Nginx 和永久链接
建立站点配置:
sudo nano /etc/nginx/sites-available/typecho将 blog.example.com 替换成域名 www.furthe77oad.top:
server {
listen 80;
listen [::]:80;
server_name blog.example.com;
root /var/www/typecho;
index index.php index.html;
charset utf-8;
server_tokens off;
client_max_body_size 20m;
location / {
try_files $uri $uri/ /index.php$uri?$query_string;
}
# 上传目录禁止运行 PHP
location ~* ^/usr/uploads/.*\.php(?:/|$) {
deny all;
}
location ~ \.php(?:/|$) {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location = /config.inc.php {
deny all;
}
location ~ /\.(?!well-known).* {
deny all;
}
location ~* \.(?:css|js|jpg|jpeg|png|gif|webp|avif|svg|ico|woff|woff2)$ {
expires 7d;
access_log off;
}
access_log /var/log/nginx/typecho-access.log;
error_log /var/log/nginx/typecho-error.log;
}启用站点:
sudo ln -s /etc/nginx/sites-available/typecho \
/etc/nginx/sites-enabled/typecho
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx域名解析和 HTTPS
在阿里云云解析 DNS 添加:
- 子域名博客:
- 记录类型:A
- 主机记录:
blog - 记录值:服务器公网 IPv4
- 主域名:
- 主机记录:
@
- 主机记录:
www:- 主机记录:
www
- 主机记录:
A 记录就是把域名映射到服务器的固定 IPv4。阿里云 DNS A 记录说明
验证:
nslookup blog.example.com
curl -I http://blog.example.com安装免费 HTTPS 证书:
sudo snap install --classic certbot
sudo ln -sf /snap/bin/certbot /usr/local/bin/certbot
sudo certbot --nginx -d blog.example.com选择自动把 HTTP 重定向到 HTTPS。
测试自动续期:
sudo certbot renew --dry-runCertbot 会自动修改 Nginx 并安装续期定时器。Certbot Nginx 官方教程
完成 Typecho 网页安装
浏览器打开:
https://blog.example.com/install.php填写:
- 数据库适配器:
Pdo_Mysql - 数据库地址:
localhost - 数据库名:
typecho - 数据库用户名:
typecho - 数据库密码:前面生成的密码
- 表前缀:
typecho_ - 管理员用户名:不要使用
admin - 管理员密码:另一个高强度密码
- 管理员邮箱:真实邮箱
安装完成后收紧配置文件权限:
sudo chown root:www-data /var/www/typecho/config.inc.php
sudo chmod 640 /var/www/typecho/config.inc.php然后在 Nginx 的 server 中加入:
location = /install.php {
deny all;
}检查并加载:
sudo nginx -t
sudo systemctl reload nginx后台建议设置:
- 基本设置:站点地址必须是
https:// - 永久链接:建议只在建站初期设置一次,例如
/post/{slug}/ - 文章缩略名使用稳定的英文,如
build-a-typecho-blog - 评论:首次评论审核、垃圾评论过滤
- 不需要引用通告时关闭 Pingback
- 创建独立页面:关于、归档、友情链接、隐私说明
永久链接一旦被搜索引擎收录,不要频繁更换。
怎么换主题
主题放在:
/var/www/typecho/usr/themes/一个合格主题的目录第一层至少应有 index.php;官方主题文件结构也以此识别。Typecho 主题文件结构
主题选择标准:
- 明确支持 Typecho 1.3 和 PHP 8.3
- 最近一年仍有更新
- 有公开源代码和许可证
- 不包含加密、混淆 PHP
- 不依赖已失效的远程授权服务器
- 支持移动端、深色模式和代码块
- 不强制加载 Google Fonts;中国内地访问最好用系统字体或自托管字体
第一次建议先用官方默认主题把全站跑通,再换第三方主题。
安装流程:
- 在 Mac 下载主题的正式 Release。
- 解压后确认不是“文件夹套文件夹”。
- 用 Transmit/SFTP 上传到
/home/blogadmin/。 - 在服务器执行:
sudo mv /home/blogadmin/主题目录 \
/var/www/typecho/usr/themes/主题目录
sudo chown -R root:www-data \
/var/www/typecho/usr/themes/主题目录
sudo find /var/www/typecho/usr/themes/主题目录 \
-type d -exec chmod 755 {} \;
sudo find /var/www/typecho/usr/themes/主题目录 \
-type f -exec chmod 644 {} \;- 后台 → 控制台 → 外观 → 启用主题。
- 检查首页、文章、分类、搜索、404、评论、手机端和数学公式。
Typecho 没有标准“子主题”机制。需要修改主题时,复制一个新目录,例如 theme-custom,不要直接改原目录,否则升级主题会覆盖修改。
文章怎么合理管理
建议把“分类”理解为书架,把“标签”理解为索引词。
分类
控制在 5–8 个长期稳定的主题,例如:
技术
├─ 后端
├─ 运维
└─ 工具
读书
随笔
项目一篇文章通常只放进一个主分类。
标签
- 每篇 2–5 个
- 使用固定词表
- 避免同时出现“mac”“Mac”“macOS”三个同义标签
- 标签用于跨分类关联,例如
Typecho、Nginx、macOS
本地文章目录
把本地 Markdown 作为内容源,Typecho 数据库作为发布结果:
blog-content/
├── drafts/
├── posts/
│ ├── 2026/
│ └── 2027/
├── assets/
│ └── build-a-typecho-blog/
└── templates/
└── post.md文章模板:
---
title: 在阿里云搭建 Typecho 博客
slug: build-a-typecho-blog
date: 2026-09-02
category: 运维
tags:
- Typecho
- Nginx
status: draft
summary: 从服务器购买到本地发布的完整过程。
---
正文开头……
<!--more-->
正文后半部分……这个 YAML 头主要用于本地管理,Typecho 本身不直接解析它;使用 MWeb 发布时把这些内容填写到标题、分类、标签等发布字段。
本地目录初始化 Git:
cd ~/Documents/blog-content
git init
git add .
git commit -m "Initialize blog content"重要文章修改后提交一次。再配合 Time Machine,就同时拥有本地历史和服务器备份。
图片规则
- 文件名:
slug-image-01.webp - 普通正文图宽度控制在 1200–1600px
- 照片优先 WebP,截图可用 PNG/WebP
- 每张图片写有意义的
alt - 不要一开始就上 OSS/CDN;本地上传最稳定
- 等图片达到数 GB 或带宽明显吃紧,再迁移 OSS
在 Mac 上优雅地本地发表
最适合 Typecho 的方案是 MWeb。它原生支持 Markdown、LaTeX、图片管理和 MetaWeblog API,官方文档还直接给出了 Typecho 的接口地址。MWeb Typecho 发布说明
配置步骤:
Typecho 创建一个单独的“编辑”用户,不要把管理员密码交给发布软件。
MWeb → 偏好设置 → 发布服务。
新增
MetaWeblog API。API 地址:
已开启永久链接重写:
https://blog.example.com/action/xmlrpc未开启重写:
https://blog.example.com/index.php/action/xmlrpc
填写独立编辑用户及强密码。
如果显示“发布为 Markdown”,勾选它。
第一篇先作为草稿发布。
验证分类、标签、图片和公式。
修改本地原文后使用“更新已发布文档”,不要再次创建新文章。
MWeb 可以上传本地图片,并记住文章与远端文章的对应关系,因此后续可以直接更新。MWeb 发布服务文档
安全注意:
- XML-RPC 必须使用 HTTPS
- 使用独立编辑账号
- 使用随机长密码
- Typecho 始终保持最新稳定版
- 如果以后不用 MWeb,在 Nginx 中关闭接口:
location = /action/xmlrpc {
return 404;
}
location = /index.php/action/xmlrpc {
return 404;
}更保守的备选工作流是:Obsidian/Typora 本地写 Markdown,再把原始 Markdown 粘贴进 Typecho 后台。自动化少一点,但攻击面也更小。
Markdown、公式和优雅渲染
Typecho 原生支持 Markdown,但核心不直接处理数学公式。推荐安装 MarkdownParse,它使用 CommonMark/GFM,支持表格、任务列表、脚注、目录、MathJax、Mermaid 和图片懒加载;要求 Typecho 1.2+、PHP 8.2+。MarkdownParse 项目说明
安装:
从项目的 Releases 下载最新正式安装包,不要下载缺少依赖的 Source Code 压缩包。
解压并把目录改名为:
MarkdownParse上传到:
/var/www/typecho/usr/plugins/MarkdownParse设置权限:
sudo chown -R root:www-data \
/var/www/typecho/usr/plugins/MarkdownParse
sudo find /var/www/typecho/usr/plugins/MarkdownParse \
-type d -exec chmod 755 {} \;
sudo find /var/www/typecho/usr/plugins/MarkdownParse \
-type f -exec chmod 644 {} \;- 后台 → 控制台 → 插件 → 激活
MarkdownParse。 - 设置:
- TOC:开启
- MathJax:按需加载
- Mermaid:按需加载
- 中国内地 CDN:先用默认国内源;如果不稳定再切换
- Pjax 主题:如果页面切换后公式消失,改成“每次加载”
公式测试文章:
行内公式:$E = mc^2$。
块级公式:
$$
\int_{-\infty}^{+\infty} e^{-x^2}\,dx = \sqrt{\pi}
$$
矩阵:
$$
A =
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}
$$主题 CSS 中建议补充:
.post-content {
max-width: 760px;
margin-inline: auto;
color: #24292f;
font-size: 17px;
line-height: 1.85;
overflow-wrap: anywhere;
font-family:
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
"PingFang SC",
"Hiragino Sans GB",
"Microsoft YaHei",
sans-serif;
}
.post-content img {
display: block;
max-width: 100%;
height: auto;
margin: 1.5rem auto;
border-radius: 8px;
}
.post-content pre {
overflow-x: auto;
padding: 1rem 1.2rem;
border-radius: 8px;
line-height: 1.6;
}
.post-content table {
display: block;
max-width: 100%;
overflow-x: auto;
border-collapse: collapse;
}
.post-content blockquote {
margin-left: 0;
padding: .2rem 1rem;
color: #57606a;
border-left: 4px solid #d0d7de;
}
.katex-display,
mjx-container[display="true"] {
max-width: 100%;
overflow-x: auto;
overflow-y: hidden;
padding: .4rem 0;
}把 .post-content 替换成主题实际的正文容器类名。不要同时启用两个 Markdown 解析插件或两个 MathJax 插件,否则容易重复渲染。
备份与日常维护
ECS 默认不会自动备份云盘,应主动配置自动快照;轻量服务器每台最多保留 3 个免费快照,而且服务器释放后快照也会消失。ECS 自动快照、轻量服务器快照
推荐备份层次:
- 本地 Markdown + Git。
- 每日数据库备份。
- 每日备份
usr和config.inc.php。 - ECS 每周自动快照;轻量服务器在每次升级前手工快照。
- 每周把服务器备份下载到 Mac。
创建备份目录:
sudo install -d -m 700 \
-o blogadmin -g blogadmin \
/home/blogadmin/typecho-backups创建脚本:
sudo nano /usr/local/sbin/backup-typecho内容:
#!/usr/bin/env bash
set -euo pipefail
backup_dir="/home/blogadmin/typecho-backups"
stamp="$(date +%F-%H%M)"
mariadb-dump \
--single-transaction \
--quick \
typecho |
gzip > "${backup_dir}/db-${stamp}.sql.gz"
tar -C /var/www/typecho \
-czf "${backup_dir}/files-${stamp}.tar.gz" \
usr config.inc.php
chown blogadmin:blogadmin "${backup_dir}"/*
chmod 600 "${backup_dir}"/*
find "${backup_dir}" \
-type f \
-mtime +14 \
-delete授权:
sudo chmod 700 /usr/local/sbin/backup-typecho
sudo /usr/local/sbin/backup-typecho设置每天凌晨 3:15 执行:
sudo crontab -e加入:
15 3 * * * /usr/local/sbin/backup-typechoMac 定期下载:
mkdir -p ~/Documents/Backups/typecho
rsync -av \
aliyun-blog:/home/blogadmin/typecho-backups/ \
~/Documents/Backups/typecho/维护节奏:
- 每周:检查网站、磁盘和备份
- 每月:安装 Ubuntu 安全更新
- 升级前:数据库备份 + 快照
- 每季度:实际测试一次备份恢复
- Typecho 升级时保留
usr,因为主题、插件和上传文件都在这里;官方升级说明也明确要求不要删除它。Typecho 升级说明
检查命令:
df -h
free -h
sudo nginx -t
sudo systemctl status nginx php8.3-fpm mariadb
curl -I https://blog.example.com
sudo tail -n 100 /var/log/nginx/typecho-error.log最终理想状态是:服务器只负责运行和发布,Mac 上保留全部 Markdown 原稿及历史,数据库和附件每天备份,主题与插件数量保持克制,数学公式由一个统一的 Markdown 渲染器负责。这样既好看,也比较容易在几年后继续维护。