Typecho + Mailu(mailu-front)反向代理部署:*你的博客域名*

这篇文章记录一种不抢占 80/443的部署方式:让 Mailu 的 mailu-front 继续作为公网唯一入口(HTTPS/TLS 也由它统一处理),再把某个子域名(例如 blog.*你的域名*)反向代理到宿主机 nginx 的 8080,从而在同一台 VPS 上跑 Typecho。

为了方便你复制粘贴后直接改参数,文中敏感信息都用更自然的占位符:

  • 域名:*你的域名**你的博客域名*
  • IP:*你的IP*
  • 密码:*请设置一个强密码*
  • 管理员用户名:*你的用户名*


0. 最终架构

  • 公网 80/443:Mailu mailu-front(Docker 内 nginx)
  • 宿主机 nginx:仅监听 8080(内网/本机)
  • Typecho:宿主机 nginx → PHP-FPM → Typecho

访问链路:

  1. 浏览器访问 https://*你的博客域名*/
  2. 命中 mailu-front:443(TLS 终止、证书由 Mailu/Let’s Encrypt 管)
  3. mailu-front 依据 Host=*你的博客域名* → 反代到 http://192.168.203.1:8080
  4. 宿主机 nginx:8080 → PHP-FPM → Typecho


1. 前置条件

1.1 DNS

blog.*你的域名* A 记录指向 VPS:

dig +short blog.*你的域名* A

期望返回:*你的IP*

1.2 Mailu 已运行

要求 Mailu 已经能正常提供 HTTPS(mailu-front 正在占用 80/443)。


2. 安装基础环境(宿主机)

apt update
apt install -y nginx mariadb-server \
  php8.4-fpm php8.4-mysql php8.4-mbstring php8.4-xml php8.4-gd php8.4-curl php8.4-zip \
  unzip rsync curl ca-certificates

systemctl enable --now nginx
systemctl enable --now mariadb
systemctl enable --now php8.4-fpm


3. 部署 Typecho 程序(宿主机)

mkdir -p /var/www/typecho
chown -R www-data:www-data /var/www/typecho

cd /tmp
curl -fsSL -o typecho.zip \
  https://github.com/typecho/typecho/releases/download/v1.3.0/typecho.zip

rm -rf /tmp/typecho-download
mkdir -p /tmp/typecho-download
unzip -q typecho.zip -d /tmp/typecho-download

rsync -a --delete /tmp/typecho-download/ /var/www/typecho/
chown -R www-data:www-data /var/www/typecho


4. 创建数据库与账号(宿主机 MariaDB)

建议使用密码管理器生成数据库强密码:*请设置一个强密码*

DB_NAME=typecho
DB_USER=typecho
DB_PASS='*请设置一个强密码*'

mariadb <<SQL
CREATE DATABASE IF NOT EXISTS ${DB_NAME}
  CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 同时覆盖 localhost / 127.0.0.1,避免安装器连库方式不同导致鉴权失败
CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
CREATE USER IF NOT EXISTS '${DB_USER}'@'127.0.0.1' IDENTIFIED BY '${DB_PASS}';

GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'127.0.0.1';

FLUSH PRIVILEGES;
SQL


5. 宿主机 nginx:只监听 8080(不占用 80/443)

创建站点配置:/etc/nginx/sites-available/typecho.conf

server {
  server_name blog.*你的域名*;

  # 关键:不要占用 80/443,留给 Mailu
  listen 127.0.0.1:8080;

  # 关键:让 mailu-front 容器能访问到宿主机(Mailu docker 网络里宿主机常见地址为 192.168.203.1)
  listen 192.168.203.1:8080;

  root /var/www/typecho;
  index index.php index.html;

  client_max_body_size 32m;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.4-fpm.sock;
  }

  location ~ /(\.ht|\.git|\.env) {
    deny all;
  }
}

启用并 reload:

rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/typecho.conf /etc/nginx/sites-enabled/typecho.conf
nginx -t
systemctl reload nginx

本机测试(模拟 Host 头):

curl -I -H 'Host: blog.*你的域名*' http://127.0.0.1:8080/


6. Mailu mailu-front:按 Host 反代到宿主机 8080

在宿主机创建 override:/mailu/overrides/nginx/blog.*你的域名*.conf

# 这段配置会被包含进 mailu-front 的 https server {} 内
# 用 error_page + 命名 location 的技巧在不改 Mailu 模板的情况下实现按 Host 分流

if ($host = blog.*你的域名*) {
  return 418;
}

error_page 418 = @blog_typecho;

location @blog_typecho {
  proxy_http_version 1.1;
  proxy_set_header Host              $host;
  proxy_set_header X-Real-IP         $remote_addr;
  proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto https;

  proxy_pass http://192.168.203.1:8080;
}

在容器内检查并 reload:

docker exec mailu-front-1 nginx -t
docker exec mailu-front-1 nginx -s reload


7. 让 Mailu 的证书覆盖博客域名

编辑 /mailu/mailu.env,确保 HOSTNAMES 包含你的邮件域名与博客域名,例如:

HOSTNAMES=mx.*你的域名*,blog.*你的域名*

更新 Mailu:

cd /mailu
docker compose up -d

查看证书 SAN:

echo | openssl s_client -servername blog.*你的域名* -connect 127.0.0.1:443 2>/dev/null \
  | openssl x509 -noout -text | grep -A2 'Subject Alternative Name'


8. Web 安装 Typecho

浏览器打开:

  • https://blog.*你的域名*/

数据库配置建议:

  • 主机:127.0.0.1
  • 端口:3306
  • 数据库:typecho
  • 用户:typecho
  • 密码:你设置的那条强密码
  • 表前缀:typecho_

管理员(示例写法):

  • 用户名:*你的用户名*
  • 密码:*请设置一个强密码*(不要写进脚本/聊天记录)


9. 安装后加固

安装完成后删除 install.php,避免被二次安装:

rm -f /var/www/typecho/install.php


10. 体验优化:代码块高亮 + 复制 + 在线改参数

为了让读者能更方便把 *你的域名**你的IP**请设置一个强密码* 直接改成自己的,本博客在主题里加了 Prism.js:

  • 代码块高亮
  • 每个代码块右上角:编辑(可把占位符改成自己的)/ 复制

实现方式(思路):把 Prism 的 CSS/JS 放到主题目录,并在主题的 header.php / footer.php 引入。额外加一段小 JS 给代码块加“编辑/复制”按钮。


11. 验证清单

  • https://blog.*你的域名*/ 前台可访问
  • https://blog.*你的域名*/admin/ 后台可登录
  • 证书 SAN 包含 blog.*你的域名*
  • 宿主机 nginx 未占用 80/443(全部流量经由 Mailu)

标签: none

添加新评论