Typecho + Mailu(mailu-front)反向代理部署:*你的博客域名*
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
访问链路:
- 浏览器访问
https://*你的博客域名*/ - 命中
mailu-front:443(TLS 终止、证书由 Mailu/Let’s Encrypt 管) mailu-front依据 Host=*你的博客域名*→ 反代到http://192.168.203.1:8080- 宿主机 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-fpm3. 部署 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/typecho4. 创建数据库与账号(宿主机 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;
SQL5. 宿主机 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 reload7. 让 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.php10. 体验优化:代码块高亮 + 复制 + 在线改参数
为了让读者能更方便把 *你的域名*、*你的IP*、*请设置一个强密码* 直接改成自己的,本博客在主题里加了 Prism.js:
- 代码块高亮
- 每个代码块右上角:编辑(可把占位符改成自己的)/ 复制
实现方式(思路):把 Prism 的 CSS/JS 放到主题目录,并在主题的 header.php / footer.php 引入。额外加一段小 JS 给代码块加“编辑/复制”按钮。
11. 验证清单
https://blog.*你的域名*/前台可访问https://blog.*你的域名*/admin/后台可登录- 证书 SAN 包含
blog.*你的域名* - 宿主机 nginx 未占用 80/443(全部流量经由 Mailu)