Furthe77oad
Furthe77oad
发布于 2026-09-06 / 0 阅读
0
0

博客搭建

写在最前

之前用来养龙虾的服务器在上学期(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 配置远程连接

  1. 创建专用 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 登录。

  1. 简化日常连接

编辑 ~/.ssh/config:

Host aliyun-blog
    HostName 服务器公网IP
    User blogadmin
    IdentityFile ~/.ssh/id_ed25519_aliyun_blog
    IdentitiesOnly yes
    ServerAliveInterval 60

以后直接:

ssh aliyun-blog

macOS 自带完整 SSH 客户端。Apple Terminal 远程连接说明

  1. 图形化和可视化方案(笔者这里还没有做)

不要使用传统 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 -h

Swap 只是防止偶发内存峰值,不是内存的替代品。

创建 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 = 0

2 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-run

Certbot 会自动修改 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;中国内地访问最好用系统字体或自托管字体

第一次建议先用官方默认主题把全站跑通,再换第三方主题。

安装流程:

  1. 在 Mac 下载主题的正式 Release。
  2. 解压后确认不是“文件夹套文件夹”。
  3. 用 Transmit/SFTP 上传到 /home/blogadmin/。
  4. 在服务器执行:
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 {} \;
  1. 后台 → 控制台 → 外观 → 启用主题。
  2. 检查首页、文章、分类、搜索、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 发布说明

配置步骤:

  1. Typecho 创建一个单独的“编辑”用户,不要把管理员密码交给发布软件。

  2. MWeb → 偏好设置 → 发布服务。

  3. 新增 MetaWeblog API。

  4. API 地址:

    • 已开启永久链接重写:

      https://blog.example.com/action/xmlrpc
    • 未开启重写:

      https://blog.example.com/index.php/action/xmlrpc
  5. 填写独立编辑用户及强密码。

  6. 如果显示“发布为 Markdown”,勾选它。

  7. 第一篇先作为草稿发布。

  8. 验证分类、标签、图片和公式。

  9. 修改本地原文后使用“更新已发布文档”,不要再次创建新文章。

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 项目说明

安装:

  1. 从项目的 Releases 下载最新正式安装包,不要下载缺少依赖的 Source Code 压缩包。

  2. 解压并把目录改名为:

    MarkdownParse
  3. 上传到:

    /var/www/typecho/usr/plugins/MarkdownParse
  4. 设置权限:

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 {} \;
  1. 后台 → 控制台 → 插件 → 激活 MarkdownParse。
  2. 设置:
    • 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 自动快照、轻量服务器快照

推荐备份层次:

  1. 本地 Markdown + Git。
  2. 每日数据库备份。
  3. 每日备份 usr 和 config.inc.php。
  4. ECS 每周自动快照;轻量服务器在每次升级前手工快照。
  5. 每周把服务器备份下载到 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-typecho

Mac 定期下载:

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 渲染器负责。这样既好看,也比较容易在几年后继续维护。


评论