1Panel 一键部署 Typecho + 反向代理挂域名(新手版)
环境:1Panel v2(应用商店 Docker 版 Typecho)+ OpenResty + MySQL 8
文中域名统一写blog.example.com,替换成你自己的。
适用人群:不想碰 PHP 环境、不想上传源码,能把站点跑起来就行。
先看全貌(30 秒)
1 | ① 装 Typecho(应用商店) → ② 建站挂域名 + HTTPS |
只有 4 步。跟"上传源码 + 配 PHP 运行环境"那条路比,这条少了 PHP 环境、少了文件权限、少了 nginx 伪静态——因为官方镜像里 Apache 全给你配好了。
唯一的坑在"地址"上:容器不知道你外面挂的是域名,会以为自己还叫 localhost,结果 CSS/JS 全 404,页面变成没样式的白板。第 ② 步和第 ④ 步都是围绕这件事。
开始前
| 项目 | 要求 |
|---|---|
| 域名 | 已 A 记录解析到服务器 IP;境内服务器需已备案 |
| OpenResty | 应用商店里装好(1Panel 建站依赖它) |
| 端口 | 给 Typecho 留一个没被占用的,本文用 8089 |
① 装 Typecho
1Panel → 应用商店 → 搜 Typecho → 安装
安装界面能填的东西不多,重点看这几项(字段名各版本略有差异,认含义就行):
| 字段 | 填什么 | 为什么 |
|---|---|---|
| 名称 | typecho | 后面容器名会带这个 |
| 版本 | 1.2.x / 1.3.x 的 php8-apache 镜像 | 别选 php7 老版本 |
| 端口 | 8089(自定义,别用 80/443) | 宿主机映射端口,反向代理就指它 |
| 外部访问地址 | https://blog.example.com | ⚠️ 千万别留 localhost,这个值会写进站点地址,填错就是白板页面 |
| 数据库 | 选已有的 MySQL;没有就去装一个 | Typecho 不自带数据库 |
如果安装界面没有"数据库"这项,说明镜像内置了 SQLite,能跑但备份/迁移麻烦,建议还是接 MySQL:
- 1Panel → 数据库 → 创建数据库:库名
typecho、用户typecho、密码点「随机」复制下来、字符集utf8mb4(漏了这步,中文和 emoji 会变问号)
安装时不要勾"端口外部访问"。Typecho 只需要被本机 OpenResty 访问,走回环即可。真要对公网开放那一下(比如排查问题),记得查完就关。
装完在 应用商店 → 已安装 里能看到 Typecho 卡片,状态「已启动」就对了。
② 建站挂域名 + 开 HTTPS
1Panel → 网站 → 创建网站,这里有两条路,效果一样:
路线 A:一键部署(推荐,少填两栏)
建站弹窗选「一键部署」→ 勾选刚才装的 typecho → 域名填 blog.example.com → 确认。
面板会自动把代理地址配好,不用你填端口。
路线 B:反向代理(一键部署里找不到 Typecho 时用)
建站弹窗选「反向代理」:
| 字段 | 值 |
|---|---|
| 域名 | blog.example.com |
| 代理地址 | http://127.0.0.1:8089(就是 ① 里填的端口) |
写 127.0.0.1 而不是服务器公网 IP:走回环不经过网卡和防火墙,也少暴露一个入口。建完立刻开 HTTPS
网站 → 你的站点 → HTTPS → 打开开关 → 选证书(没有就点 Let's Encrypt 申请)→ 打开强制 HTTPS。
顺序有讲究:先挂域名和 HTTPS,再跑安装向导。因为 Typecho 会把"你访问它时用的地址"写进数据库当站点地址——你从 https://域名 进去装,它记的就是对的;装完再改,得动好几个地方。反向代理的请求头(默认就有,确认一下)
进 网站 → 你的站点 → 配置文件,代理那一段应该有这几行:
1 | proxy_set_header Host $host; |
Host 和 X-Forwarded-Proto 是最关键的两个——少了它们,Typecho 生成出来的链接会变成 http://localhost/...,后台保存设置后还会自己跳丢。
改完配置记得两步都跑(只跑 -t 不生效,这是最常见的"明明改了没变化"):
1 | docker exec 1Panel-openresty-xxxx openresty -t |
容器名在 容器 列表里看,形如 1Panel-openresty-cGcF。
③ 跑安装向导
浏览器打开 https://blog.example.com,会自动跳到安装页。
数据库那一步最容易卡,照这样填:
| 字段 | 填什么 |
|---|---|
| 数据库地址 | MySQL 的容器名,如 1Panel-mysql-8x7f;忘了去 1Panel 数据库详情页看「连接信息」 |
| 端口 | 3306 |
| 用户名 / 密码 / 库名 | ① 里建的 typecho / 你复制的密码 / typecho |
为什么填容器名?Typecho 和 MySQL 都在1panel-network这个 Docker 网络里,容器之间直接用名字互找。填localhost指的是 Typecho 容器自己,那儿没有数据库。
填容器名还连不上,就退一步填宿主机内网 IP(不是公网 IP)。
往下设置管理员:
- 用户名别用
admin——爆破脚本第一个猜的就是它 - 密码 12 位以上,字母 + 数字 + 符号
看到「安装成功」,进下一步收尾。
④ 收尾核对(2 分钟,重点看两个地址)
4.1 后台站点地址
后台 → 设置 → 基本设置 → 站点地址,必须是:
1 | https://blog.example.com |
如果是 http://localhost 或 http://IP:8089,立刻改。这个值决定了前台所有链接、CSS、图片地址怎么拼——这一项错,全站就是白板。
4.2 容器参数里的外部访问地址
1Panel → 应用商店 → 已安装 → Typecho → 参数,检查"外部访问地址"这类字段是不是 https://blog.example.com。
改完点确认,容器会自动重启,等 10 秒再刷页面。
4.3 顺手的几件小事
- [ ] 删安装文件:文件在容器目录里,进 容器 → 编排 → typecho → 目录,把
install.php删掉(或改名为.bak)。留着等于挂了个「随时重装覆盖你数据」的入口。 - [ ] 改管理员名:后台 → 用户,把账号名换掉。
- [ ] 确认后台能进:
https://blog.example.com/admin/,能进就说明整条链路通了。
关于伪静态:这条路线不用配
这是源码路线和 Docker 路线最大的差别,很多人在这里白折腾:
Docker 版 Typecho 跑的是 Apache,自带的 .htaccess 已经处理了地址重写。所以你不需要去 1Panel 的「伪静态」里选 typecho 模板——nginx 只是把请求原样转给容器,重写是在容器里完成的。
你只需要:后台 → 设置 → 永久链接 → 勾上「地址重写」→ 保存。
链接会从 /index.php/archives/1/ 变成 /archives/1/。
如果勾了之后文章全 404:把「地址重写」先取消保存、再勾上保存一次,Typecho 会重新刷写重写规则。这招在迁移服务器后特别好使。
附录 A:主题和插件放哪
Docker 版不能直接往网站根目录拖文件了,走这条路:
容器 → 编排 → typecho → 目录 → 进 data/usr/:
| 目录 | 放什么 |
|---|---|
usr/themes/ | 主题(解压后的文件夹直接扔进来) |
usr/plugins/ | 插件 |
usr/uploads/ | 你上传的图片 |
放完回后台 → 控制台 / 外观,就能看到新主题和插件了。
附录 B:安全两条
别让
IP:8089能从公网打开
这个入口完全绕过 nginx、HTTPS 和所有鉴权规则。先确认反代走的是回环:1grep -rn "proxy_pass" /opt/1panel/www/sites/blog.example.com/proxy/看到
127.0.0.1:8089就放心去云厂商安全组删掉 8089 入方向规则——安全组只管外网进来的流量,本机回环不走它,站点照样能开。- 后台套一层统一登录
如果已经上了 Authelia 之类的鉴权,要把/admin和/action/login也纳进去。只保护首页等于留后门:别人直接敲后台地址照样能对着密码框试。
附录 C:备份(数据丢一次就懂)
数据在两个地方,只备一个等于没备:
| 内容 | 位置 |
|---|---|
| 文章、评论、设置、主题配置 | MySQL 数据库 typecho |
| 主题文件、插件、上传的图片 | 容器目录下的 data/usr/ |
1Panel → 计划任务,建两条:备份数据库(每天,留 7 份)、备份 Typecho 应用目录(每周,留 4 份)。
附录 D:报错对照表
| 现象 | 原因 | 处理 |
|---|---|---|
| 页面能开但没有样式,白底黑字 | 站点地址是 localhost | 按 ④ 的两处地址都改成域名 |
| 样式正常但点文章 404 | 后台没勾「地址重写」 | 勾上保存;还不行就取消再勾一次 |
| 安装页连不上数据库 | 地址填了 localhost | 填 MySQL 容器名或宿主机内网 IP |
报 caching_sha2_password | MySQL 8 认证插件较新 | 1Panel 数据库里把该用户认证方式改为 mysql_native_password |
| 502 Bad Gateway | 端口填错,或容器没起来 | 核对 ① 的端口与反代里的端口;看容器状态 |
后台点保存后跳到 localhost | 反代缺 Host / X-Forwarded-Proto | 补请求头,-t + -s reload |
| 上传图片失败 | usr/uploads 不可写 | 容器目录里给该目录放宽权限,或检查属主 |
| 上传主题提示文件过大 | PHP 上传上限太小 | 应用 → 参数里调 upload_max_filesize、post_max_size 到 32M,重建容器 |
| 中文、emoji 变问号 | 建库时字符集不是 utf8mb4 | 只能导出重导,建库时别手快 |
附录 E:什么时候该换源码路线
一键部署适合"写好文章就完事"。如果你后面想:
- 频繁改主题源码、调试 PHP
- 装需要改系统文件的插件
- 用 Nginx 侧做缓存/防盗链/CDN 回源细节调整
那源码 + PHP 运行环境那条路更顺手。但先把这条跑通——知道域名、反代、站点地址三者怎么对应,再换路线就不会抓瞎。