两周前帮一个朋友把博客从虚拟主机迁到自己的 Linux 服务器上,用的还是 Typecho。整个过程走完,我顺手把部署笔记整理成了这篇博文:Linux 系统打底,宝塔面板做可视化运维,Nginx + PHP + MySQL 跑 Typecho。Typecho 本身就是个轻量级博客程序,安装包不到 1MB,后台也清爽,尤其适合个人博客、学习笔记和中小型内容站;宝塔面板则把 Linux 上最劝退的 LNMP 环境配置、站点创建、SSL 证书申请全部图形化了。你只要有一台云服务器和一个域名,跟着下面的流程走,半小时左右就能把 Typecho 跑起来。文章里所有步骤都是我在真实环境里踩过坑之后整理出来的,新手可以直接照抄,老手也可以看看有没有能优化的地方。
1. 为什么选 Typecho + Linux + 宝塔面板,而不是其他组合
1.1 Typecho 适合谁:轻量到可以忽略学习成本
Typecho 在国内博客圈里一直有一批死忠用户,核心原因就是“轻”。它跟 WordPress 走的是完全不同的路线:WordPress 功能多、插件生态大,但同时意味着臃肿,随便一个页面加载十几个脚本很正常;Typecho 则把“写博客”这件事做得很纯粹,安装包就几百 KB,后台响应速度用“秒开”形容不过分。如果你的需求是认真记录技术笔记、写写生活随笔,不想折腾复杂的页面构建器和会员系统,Typecho 的默认主题和插件机制基本够用。
我见过很多人一上来就选 WordPress,结果为了速度装一堆缓存插件,为了样式装一堆页面构建器,最后服务器配置越拉越高,其实博客的核心还是内容。Typecho 则适合那种“不想被建站工具绑架”的人,它能把更多精力留给写作本身。当然,它也不是没有缺点:插件和主题数量远不如 WordPress,社区维护节奏也慢,但日常写博客完全不受影响。
1.2 宝塔面板的价值:把服务器运维这件事讲人话
Linux 服务器本身是纯命令行的,新手第一次进去面对黑乎乎的终端,光是装 Nginx、PHP、MySQL 这套 LNMP 环境就能劝退一大半人。宝塔面板做了一件很重要的事:把 Linux 上的常见运维操作图形化,而且不是那种中看不中用的“控制台”,而是真正能改配置、看日志、跑定时任务的管理工具。
具体到 Typecho 部署,宝塔能帮我们把下面这些事一键搞定:安装 Nginx、MySQL、PHP 以及扩展,创建网站站点并自动生成 Nginx 配置,创建站点数据库并分配账号,申请和续期 SSL 证书,打包备份网站和数据库,以及查看 Nginx 和 PHP 的错误日志。对我来说,宝塔最大的价值不是省掉了敲命令的时间,而是让“服务器发生了什么”变得可见,排错效率高了一个量级。
注意:宝塔面板免费版对个人建站来说已经很够用了,没必要去折腾来源不明的破解插件,那些所谓的“开心版”很容易被植入后门,拿服务器给别人当肉鸡,得不偿失。
1.3 同类方案横向对比,我为什么没选 Docker
有人会问,都 202X 年了,为什么不用 Docker 部署 Typecho?我承认 Docker 确实能保证环境一致性,迁移也方便,但对 Typecho 这种小型项目来说,它引入的复杂度往往大于收益。Typecho 对运行环境要求极低,PHP + MySQL 就能跑,宝塔面板原生安装的环境完全够稳定,出了问题社区资料也多。
我做了一个简单对比,贴出来供你参考。
| 方案 | 环境配置 | 适用人群 | 维护成本 | 迁移难度 |
|---|---|---|---|---|
| 手动编译/命令行 LNMP | 高,需要熟悉源码编译 | 进阶运维 | 中 | 中 |
| 宝塔面板 LNMP | 低,点几下完成 | 大多数个人站长 | 低 | 低 |
| Docker + docker-compose | 中,需要理解容器 | 熟悉容器化的开发者 | 中 | 低 |
如果你本来就在用 Docker 管理其他服务,那用 Docker 跑 Typecho 也不是不行;如果只是为了这一个博客去学容器编排,真没必要。我自己实际部署过三次 Typecho,两次走宝塔,一次用 Docker,最后留在生产环境的反而是宝塔这个方案,因为它后续改配置、看日志、备份都太方便了。
2. 部署前准备:服务器、系统与域名
2.1 服务器配置怎么选,Linux 发行版该怎么挑
Typecho 是真不挑配置。早期我用过 1 核 1G 的小机器跑它,Nginx + MySQL + PHP-FPM 三个进程加起来内存占用也就五六百兆,访问量不高的情况下稳稳的。如果你是新手,建议从 2 核 2G 起步,这样即使后面开了 OPcache、装了各种插件,系统依然很从容。带宽方面,个人博客 3M 到 5M 足够,静态资源后面可以再接 CDN。总之,不要在服务器上花冤枉钱,Typecho 不值得你为它买高配。
系统镜像的选择上,我的建议是:Debian 12、Ubuntu 22.04、Rocky Linux 9 都可以,选一个你稍微熟悉的发行版。现在很多云厂商默认推荐 CentOS,但 CentOS 7 已经停止维护,新部署不建议再用了。宝塔面板对这些主流的发行版支持都很好,安装脚本会自动适配。
2.2 域名解析:A 记录其实就一步
域名解析听起来很专业,实际就一步:在云服务商的 DNS 控制台里,把域名的 A 记录指向服务器公网 IP。如果你还要用 www 域名,可以单独再加一条 A 记录,主机记录填 www,IP 填同一个。
解析配置好之后,建议在本地终端里用 ping 或者 nslookup 验证一下,确认解析已生效再继续。不同的 DNS 服务商生效速度不一样,有些要几分钟,有些要几小时。如果你等得着急,可以在服务器的 hosts 文件里临时绑定一下,先把博客跑起来,但真正访问还是要等解析生效。
我在实际操作中还会顺手做一个动作:在宝塔面板的“网站”里添加站点时,两个域名都填上,一个主域名,一个 www 域名,这样后面就不用再为要不要加 www 而发愁了。
2.3 安装宝塔面板:命令不难,但有两个坑
安装宝塔面板最简单的办法,是去宝塔官网找到对应系统的安装脚本,复制后在服务器终端执行。脚本执行时间受服务器网络影响,一般几分钟到十几分钟,装完会输出面板地址、默认用户名和密码,记得截图保存。
安装命令大概长这样(以官网最新脚本为准):
wget -O install.sh https://download.bt.cn/install/install_6.0.sh bash install.sh第一个坑是云服务器的安全组。很多新手装完面板,发现浏览器访问不了面板地址,问题八成出在安全组没放行端口。现在云厂商默认的安全组只放行 22、80、443 等少数端口,你必须在控制台再放行面板端口和端口范围。不同厂商的操作入口不一样,但逻辑都是“入方向规则”里加一条允许。
第二个坑是首次登录后的安全设置。宝塔默认的 8888 端口和随机安全入口虽然能用,但建议进面板后马上做两件事:改一个不容易猜的端口,并绑定一个安全入口路径。绑定安全入口后,访问面板的 URL 会多一个路径后缀,能挡掉大部分扫描器。这些都是面板初始化向导里的选项,直接照做就行。
3. 环境初始化与创建网站:LNMP 安装、站点和数据库
3.1 第一次进面板:先装 LNMP,版本怎么选
登录宝塔面板后,首页会有一个“软件推荐”或者“一键安装”的区域,常见选择是 LNMP(Linux + Nginx + MySQL + PHP)和 LAMP(把 Nginx 换成 Apache)。对 Typecho 来说直接选 LNMP,Nginx 的并发能力和伪静态配置都比 Apache 简洁。我有时候会看到有人为了省内存选择只装 Nginx + PHP,数据库用 SQLite,但 Typecho 的日常使用还是 MySQL 更顺手,后面备份、迁移、查数据都方便,所以环境我建议一次装齐。
组件版本可以这样选:
- Nginx:稳定版即可,1.22 或 1.24 都行。
- MySQL:5.7 是稳到不能再稳的选择;如果服务器内存小于 1G,可以考虑 5.7,因为它比 8.0 吃内存少很多。8.0 也不是不行,只是对一个博客来说性能差异感知不出来。
- PHP:推荐 8.0 或 8.1。Typecho 1.2.x 兼容 PHP 8 系列,而且 8 系列运行效率更高。
装完之后,记得在 PHP 设置里确认pdo_mysql、mbstring、openssl、fileinfo这些扩展已经开启,Typecho 安装时依赖它们。宝塔默认一般都会启用,但检查一遍更稳妥。
3.2 添加站点:数据库密码当场就要记好
环境装完后,在宝塔面板左侧菜单点“网站”,然后“添加站点”。在这个页面里填写域名、选择 PHP 版本,宝塔会帮你自动创建网站目录。页面往下拉到“数据库”区域,选择“MySQL”,并填一个数据库名、用户名和密码。
这里我必须重点提醒:密码尽量设置成包含大小写、数字和特殊字符的强密码,并且立刻记录到自己的密码管理器里。很多人在这一步随便填了一个简单密码,结果密码保存在浏览器里,换台电脑就找不到了。数据库密码不像网站后台密码,忘记之后找回很麻烦。
另外,创建站点时最好顺便把“FTP”一起创建,或者干脆不用 FTP,直接用宝塔的文件管理器上传文件。FTP 用起来有小概率出现文件属主不对或者权限问题,对新手不友好,我建议直接用面板自带的文件管理器,上传和解压都是图形界面,不容易出错。
3.3 Typecho 源码下载与上传:别把目录结构搞错
添加完站点后,网站根目录默认会有一个index.html,这是宝塔生成的默认页面,可以在确认站点访问正常后删掉。接下来下载 Typecho 源码,有两种常用方式。
方式一是用 SSH 在服务器上下载并解压:
cd /www/wwwroot/你的域名 wget https://github.com/typecho/typecho/releases/latest/download/typecho.zip unzip typecho.zip如果提示没有 unzip,先安装:
# Debian/Ubuntu apt install -y unzip # Rocky Linux/CentOS 系 yum install -y unzip解压后会生成一个build目录,Typecho 的所有源码都在这个目录里。接下来有两种选择:把 build 目录里的文件全部剪切到站点根目录,或者到宝塔“网站”->“设置”->“网站目录”,把运行目录直接指向/build。我习惯用前一种,因为后续目录结构更清爽,上传插件和主题时也更好找位置。
移动文件的命令是:
cd /www/wwwroot/你的域名 cp -rf build/. ./ rm -rf build跑完之后,强烈建议执行一条权限修正命令:
chown -R www:www /www/wwwroot/你的域名宝塔的 PHP-FPM 进程是以 www 用户运行的,源码如果以 root 用户复制过去,文件属主是 root,虽然读取问题不大,但后面安装插件、上传附件时很容易出现没有写权限的诡异错误。这一步就是提前排雷。
4. 安装 Typecho 与核心配置:从向导到 HTTPS
4.1 浏览器安装向导:数据库信息填清楚就成功一半
源码放到位后,浏览器直接访问你的域名,就会看到 Typecho 的安装向导。如果你的域名还没解析生效,也可以用http://服务器IP临时访问,但安装完成后记得在后台把站点地址改成最终使用的域名。
安装向导最关键的一步是填写数据库信息,这里对应的是 3.2 节创建站点时生成的库名、用户名和密码。默认的数据库地址填localhost,端口一般不用填,保持默认即可。下面几项按实际情况简单填一下,然后就等它写入配置文件。安装完成后会进入第二步,设置管理员账号和密码,这里不要再偷懒,后台密码建议用密码管理器生成一个单独的强密码。
安装结束后,站点目录下会自动生成一个config.inc.php,这是 Typecho 的核心配置文件,里面保存了数据库连接信息。这个文件不需要手动改,但注意不要把它传到公开目录之外的地方,更不要泄露给别人,里面存着数据库密码。
4.2 伪静态与永久链接:Nginx 规则这样配
Typecho 默认的链接长这样:/index.php/archives/123.html,中间的index.php看着很碍眼,也不利于链接美观。去掉它的方法就是配置伪静态。先在宝塔网站设置里找到“伪静态”,选择 Typecho 规则,然后保存。如果你愿意手动确认,Typecho 在 Nginx 下的规则其实就是下面这一段:
location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1 last; } }伪静态为什么要配这个?原理很简单:当请求的文件在服务器上不存在时,把请求重写到index.php上,让 Typecho 的入口文件接管路由。如果你的站点目录下面确实有同名文件,也可以不被重写,所以用-e先判断文件是否存在。
配好伪静态后,进 Typecho 后台的“设置”->“永久链接”,选择你喜欢的链接结构。我个人习惯用/archives/{cid}.html,看起来干净,也方便搜索引擎理解。改完链接结构后,旧的链接地址可能会失效,如果在网上已经发布过文章,建议保持跟之前一致的格式,避免流量丢失。
4.3 SSL 证书:一键申请 Let's Encrypt 并开启强制 HTTPS
国内现在打开浏览器访问的时候,如果地址栏显示“不安全”,很多用户下意识就会关掉。给 Typecho 配置 HTTPS 已经不是可选项,而是基本操作。宝塔面板把这件事做到了极致:在“网站”->“设置”->“SSL”里,选择 Let's Encrypt 证书,填上你的域名,点申请,一分钟内证书就签发完成。
申请成功后,同一个页面会有一个“强制 HTTPS”的开关,建议直接打开。这样所有 HTTP 请求都会 301 跳转到 HTTPS,不会出现“一会儿带锁一会儿不带锁”的情况。如果你的站同时有主域名和 www 域名,记得把两个域名都勾选到证书里,或者至少让其中一个跳转到另一个。
还有一个容易忽略的细节:Let's Encrypt 证书有效期是 90 天,宝塔面板会自动续期,但续期依赖域名的解析记录。如果哪天你的域名换了解析服务商,或者服务器 IP 变了,续期脚本会失败。定期到面板的“计划任务”里检查一下续期任务是否正常执行,能省掉很多麻烦。
4.4 目录权限与后台保护:新站点最容易忽略的 3 件事
新站上线后,下面三个安全动作我建议别偷懒。
第一,目录权限别一刀切 777。网站根目录下,目录权限设置为 755,普通文件设置为 644。只要文件属主是 www,Typecho 就能够正常写入,没必要给所有人写权限。如果你发现某个目录需要写但提示没权限,优先用chown -R www:www调整属主,而不是直接 777。
第二,隐藏 Nginx 版本号和基础错误信息。大部分扫站工具都会先看 Server 头判断你用什么服务、什么版本,然后去找对应漏洞。你可以在 Nginx 配置里的http段加一行server_tokens off;,让版本号不再显示。宝塔的 Nginx 管理里也有类似选项,找不到的话手动改配置也很快。
第三,对后台路径/admin做访问控制。Typecho 后台路径固定,这没法在程序里改,但可以用 Nginx 限制来源 IP。适合那种有固定出口 IP 的用户,比如自己办公室网络或者家有公网 IP 的情况。
location ^~ /admin/ { allow 你的IP地址; deny all; }如果你没有固定 IP,不建议用这条规则,否则哪天 IP 变了,你自己都进不了后台,只能去服务器终端改配置。
5. 常见问题与排查技巧实录
5.1 安装时数据库连接失败,尤其是 No such file or directory
Typecho 安装时最大的“劝退点”就是数据库连接。最常见的一种报错是SQLSTATE[HY000] [2002] No such file or directory,看到这个英文,很多人第一反应是数据库密码错了,其实多数时候不是密码问题。
这个报错的原因是 PHP 使用 Unix Socket 去连接 MySQL,但找不到对应 Socket 文件。PHP 默认连接本地 MySQL 时会走 Socket 路径,而宝塔里的 MySQL Socket 文件路径与 PHP 编译时的默认路径可能不一致。解决方法是回到安装向导,把数据库地址从localhost改成127.0.0.1,强制 PHP 走 TCP 方式连接 MySQL,绝大多数情况下立刻就好。
如果改成127.0.0.1之后报Connection refused,那就要检查 MySQL 服务是否在运行,或者 MySQL 是否只监听了本地地址。可以在宝塔软件商店里看 MySQL 的运行状态,确认没问题再回到安装向导。
5.2 页面 404,有时不是伪静态的锅
博客装好之后,首页或文章页访问 404,先用排除法定位。第一步看网站根目录下有没有index.php,如果没有,说明源码解压结构错了——很多人把build目录本身当成了站点目录,根目录下实际没有入口文件,这不 404 才怪。
第二步检查伪静态规则。宝塔里虽然提供了 Typecho 规则,但如果你手动改过 Nginx 配置文件,或者后来切换过 PHP 版本,规则可能没生效。改完伪静态后,最好到 Nginx 设置里点一下“重载配置”,光保存不生效的情况很常见。
第三步看错误日志。宝塔的 Nginx 错误日志路径一般在/www/wwwlogs/你的域名.error.log,打开后能看到具体的 404 是哪个请求路径,能帮你更快定位是目录问题还是重写规则问题。
5.3 上传主题插件失败、后台白屏
上传主题或者安装插件时提示失败,或者传完后台直接白屏,这大概率是目录权限问题。Typecho 的usr/themes和usr/plugins目录需要 PHP 进程可写,如果你的文件属主不是 www,就会失败。在根目录执行一遍chown -R www:www /www/wwwroot/你的域名,然后重新上传。
后台白屏的另一个原因是 PHP 版本太新,某些老插件不兼容。Typecho 插件大多是很久之前写的,对 PHP 8 支持并不完美。解决办法是先通过宝塔切换 PHP 版本来临时确认是不是版本兼容问题,如果确定是某个插件导致,把插件目录从usr/plugins里先移走,等后台恢复正常再决定要不要用这个插件。
5.4 Typecho 部署问题速查表
我把这几个典型问题整理成一个速查表,收藏起来比临时百度方便。
| 问题现象 | 常见原因 | 解决方式 |
|---|---|---|
| 面板地址打不开 | 安全组未放行面板端口 | 到云控制台放行对应端口 |
| 安装时连不上数据库 | 数据库地址 localhost 走了 Socket | 改成 127.0.0.1 |
| 数据库密码报错 | 密码中包含特殊字符或填写错误 | 用 phpMyAdmin 测试连接 |
| 文章页 404 | 伪静态未配置或未重载 | 配置 Typecho 规则并重载 Nginx |
| 后台白屏 | 插件不兼容当前 PHP 版本 | 停用插件或切换 PHP 版本 |
| 上传文件失败 | 目录属主不正确 | chown -R www:www 站点目录 |
| 后台无法登录 | Cookie 作用域和站点 URL 不一致 | 检查后台“设置”中的站点地址 |
| 图片加载慢 | 原图直出且无缓存 | 开启 gzip 或接入 CDN/图床 |
6. 部署完成后的日常运维与性能优化
6.1 备份策略:不出事永远不知道它值钱
站点上线后第一件事,应该是配置自动备份。宝塔面板的“计划任务”功能可以直接添加“备份数据库”和“备份网站”两个任务,周期设为每天一次,保留最近 3 到 5 份备份即可。备份保存在服务器本地的/www/backup下,不会占用太多空间,Typecho 的数据量一般都很小。
不过我必须强调:备份文件如果只存在服务器本机,那备份的意义就打折了。有一天服务器系统盘损坏,本地备份也会一起消失。所以我习惯另外做一步:把备份目录打包下载到自己的电脑,或者同步到云存储。宝塔面板本身支持将备份发送到对象存储,配置一下就多一条后路。手动恢复的方式也很简单,在“计划任务”的备份列表里找到对应备份,点击“恢复”即可,数据库和网站文件都能一键还原。
6.2 性能优化:PHP-FPM、OPcache、gzip 三板斧
Typecho 本身已经够快,但服务器上的默认配置是按“通用站点”优化的,几个关键参数值得自己再调一调。
第一板斧是 PHP-FPM。如果你 2G 内存,可以在 PHP 设置的“性能调整”里把运行模式改成动态,并设置pm.max_children = 30左右。每个 PHP-FPM 进程大约占 30M 到 50M 内存,30 个子进程大概吃 1G 左右,不会触发内存告警。参数大概如下:
pm = dynamic pm.max_children = 30 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 15第二板斧是 OPcache。PHP 是解释型语言,每次请求都要把 PHP 文件翻译成字节码再执行,会白白消耗 CPU。开启 OPcache 后,翻译好的字节码直接存在内存里,下次请求直接复用,对 Typecho 这种项目能带来肉眼可见的提速。宝塔 PHP 设置里可以一键开启,默认参数基本够用。
第三板斧是 Nginx gzip 压缩。代码、JS、CSS 这些文本类资源开启 gzip 之后,体积能减少 60% 以上。在 Nginx 配置的 server 段加入:
gzip on; gzip_min_length 1k; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss;这三板斧落实之后,一个完全没有 CDN 的 Typecho 站点,首次访问速度都会有明显提升,更不用说后续浏览器的静态资源缓存生效之后。
6.3 日志、监控和安全收尾
上线之后别以为就完事了,实际上运维才刚开始。宝塔面板自带“监控”功能,可以看到 CPU、内存、磁盘、带宽的实时和历史趋势。日常不必天天盯,但每隔一段时间扫一眼,能发现很多隐患,比如内存持续上涨、磁盘慢慢占满之类。
安全收尾方面,我给自己的每一台服务器都会做几件事:SSH 端口从 22 改成一个高位端口,关闭 SSH 的 root 密码登录,改用密钥登录。这些都在系统层面配置,跟宝塔面板没关系,但非常重要的安全习惯。改端口前,记得先在云安全组放行新端口,否则改完自己就进不去了,这种尴尬我经历过一次,之后就再也不敢忘。
每隔几周,我还会到宝塔的“安全”菜单里看下登录日志和 SSH 登录日志,如果发现大量失败尝试,那就说明有人在扫你的机器,该加固就赶快加固。
前前后后帮朋友和自己部署过十多次 Typecho,我最大的体会是:这个博客程序真的不难,90% 的问题都出在环境、权限和伪静态这三件事上。很多人一看命令就慌,但用宝塔面板把环境可视化之后,Typecho 的难度已经低到“稍微细心一点就能独立完成”。最后再分享一个我自己的习惯:所有部署步骤我都会顺手记成一份简短的笔记,包括数据库账号、后台地址、备份位置、改过的端口,因为它能省掉你半年后“这是我自己装的站吗”的迷茫。