告别宝塔和WordPress:低配服务器从零搭建Typecho博客完整教程

原文来自我的个人博客:告别宝塔和WordPress:低配服务器从零搭建Typecho博客完整教程 - 叹惋博客

一、为什么写这篇东西

手里有台雨云低配云服务器,一直放着吃灰。装WordPress吧,怕跑不动;用Hexo吧,每次写完文章要生成、部署,总觉得不够爽快。我就想找个“打开后台→写→发布”三步走完的方案,折腾了一圈,最后Typecho留下来了。

(不过我自己的博客还是用的wordpress哈哈,主要服务器配置够)

这篇文章就是我操作的全记录——不用宝塔、不用1Panel,全在命令行里敲。服务器配置不用高,几十块一个月的机器完全够用。你要是也有台闲置的低配服务器,想搭个纯粹写东西的地方,可以参考看看。


二、为什么选Typecho而不是别的

为什么不装WordPress?

WordPress确实什么都能干,插件主题多到用不完。但代价也明显,核心代码臃肿,每次打开一个页面,后台要加载一大堆用不上的模块。我观察过内存占用,刚装完的WordPress空载就能吃掉很多内存,再加上MySQL,低配机器直接就喘不上气了。Typecho核心代码只有400KB上下,数据表才7张,同样是跑博客,Typecho清爽太多了。

为什么不用Hexo、Hugo这类静态博客?

静态博客快是真的快,几乎不占服务器资源。但我个人不太能接受那个工作流——写完文章要在本地生成静态文件,然后用git或者rsync推到服务器上。多了一步就觉得麻烦,有时候写了一小段想直接发出去,还要开终端敲命令,挺劝退的。Typecho是动态博客,后台写完点发布就完事了,写东西的冲动还在,文章已经上线了。

为什么不直接用宝塔面板或者1Panel?

宝塔安装完之后,自己就要占很多内存,还有各种后台进程一直在跑,对低配机器来说负担不小。1Panel跑在Docker上,容器本身也有开销。

我自己的想法比较简单:服务器资源本来就不多,能省一点是一点。直接装Nginx、PHP、数据库这三个核心东西,不要面板,不要额外服务,内存占用最低,也没有乱七八糟的后台进程。


三、准备工作

开始之前你得准备好这几样:

1.一台云服务器,我这里用的是雨云服务器,系统选的Ubuntu Server 24.04 LTS(下面所有命令基于这个版本)

2.一个已经解析到服务器IP的域名,没有的话直接用IP访问也行,但后面配SSL会比较折腾

3.服务器安全组里80端口22端口要放行,不然网页打不开,SSH也连不上


四、更新系统并装基础工具

新机器拿到手第一件事就是更新软件源。这个习惯建议养成,尤其Ubuntu 24.04刚出没多久,很多包还在频繁更新。

sudo apt update && sudo apt upgrade -y

update是更新软件源索引,upgrade才是真正升级已安装的包。第一次跑的时候会列出很多包要更新,等它跑完就好(我跑了挺久的,别急,慢慢等就好了)。

接着装几个后面会用到的小工具:

sudo apt install -y wget unzip curl git

1.wget用来从网上下载文件

2.unzip用来解压zip压缩包

3.curl用来测试接口或者下载东西

4.git后面装主题插件可能会用到


五、装Nginx

Nginx比Apache轻量很多,同样的硬件配置,Nginx能支撑的并发连接数比Apache高不少。处理静态文件(css、js、图片)的时候,Nginx直接用sendfile系统调用,不经过用户态拷贝,内存占用很低。

执行安装:

sudo apt install -y nginx

装完之后检查一下版本:

nginx -v

正常会显示nginx version: nginx/1.24.0(Ubuntu 24.04默认装的是1.24版本)。

启动Nginx并让它开机自己跑起来:

sudo systemctl start nginx
sudo systemctl enable nginx

start是立即启动,enable是把Nginx加到开机启动项里,下次重启服务器不用再手动敲命令。

验证是否启动成功:

sudo systemctl status nginx

看到active (running)就是正常的,按q退出来。

这时候打开浏览器,输入服务器的公网IP地址,能看到Nginx的默认欢迎页:

Welcome to nginx!

看到这个页面说明Nginx安装成功,可以往下走了。


六、装PHP

Ubuntu 24.04默认仓库里的PHP版本是8.3。Typecho官方要求PHP 7.4以上,8.3完全没问题,而且8.3比7.4性能更好,内存管理也更优化。

安装PHP 8.3以及Typecho需要的扩展:

sudo apt install -y php8.3-fpm php8.3-mysql php8.3-sqlite3 php8.3-gd php8.3-mbstring php8.3-xml php8.3-curl php8.3-opcache php8.3-zip

这些扩展各自的作用我列一下:

  • php8.3-fpm:PHP的FastCGI进程管理器,Nginx通过它来处理PHP请求
  • php8.3-mysql:MySQL数据库驱动,如果用SQLite的话这个其实可以不用,但装了也不碍事
  • php8.3-sqlite3:SQLite数据库驱动,我后面会用这个
  • php8.3-gd:图像处理库,博客里的缩略图、验证码之类的需要它
  • php8.3-mbstring:多字节字符串支持,处理中文必须要有
  • php8.3-xml:XML解析,Typecho的Feed输出用得到
  • php8.3-curl:HTTP请求库,有些插件需要远程获取数据
  • php8.3-opcache:PHP字节码缓存,能显著提升执行速度
  • php8.3-zip:Zip压缩支持,在线安装主题插件会用到

装完后查看PHP版本:

php -v

应该显示PHP 8.3.x。

启动PHP-FPM并设置开机自启:

sudo systemctl start php8.3-fpm
sudo systemctl enable php8.3-fpm

检查状态:

sudo systemctl status php8.3-fpm

看到active (running)就说明没问题。


七、选数据库

Typecho支持三种数据库:MySQL、PostgreSQL和SQLite。

我强烈推荐低配服务器用SQLite。

原因是SQLite不需要单独运行一个数据库服务进程,数据就存在网站目录下的一个文件里,不占额外内存,不需要配置用户名密码,也不需要操心数据库连接池。对于个人博客来说,SQLite的性能完全够用,我博客写了快两百篇文章,SQLite响应依然很快。

如果你非要装MySQL,可以装MariaDB(MySQL的一个分支,更轻量):

sudo apt install -y mariadb-server

安装过程中没有提示设置root密码的话,装完后运行:

sudo mysql_secure_installation

根据提示设置root密码、删除匿名用户、禁止远程root登录等。

然后创建Typecho专用的数据库和用户:

sudo mysql -u root -p

进去之后执行:

CREATE DATABASE typecho DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON typecho.* TO 'typecho_user'@'localhost' IDENTIFIED BY '你的密码';
FLUSH PRIVILEGES;
EXIT;

不过这篇教程后面我会用SQLite来演示,省事。


八、下载Typecho

先去Typecho的GitHub Releases页面看一眼最新版本号。写这篇的时候最新稳定版是1.3.0,操作的时候建议去确认一下有没有更新的版本。

进入临时目录下载安装包:

cd /tmp
wget https://github.com/typecho/typecho/releases/latest/download/typecho.zip

如果wget下载太慢,可以换成国内镜像或者先下载到本地再传到服务器。用scp传也可以:

scp /本地路径/typecho.zip root@你的服务器IP:/tmp/

解压:

unzip typecho.zip

解压后当前目录下有一个build文件夹,里面才是真正的Typecho程序文件。


九、创建网站目录

我习惯把网站文件放在/var/www/下面,这也是大多数Linux发行版默认的Web目录位置。

创建目录并把Typecho文件移过去:

sudo mkdir -p /var/www/typecho
sudo cp -r /tmp/. /var/www/typecho/

查看一下目录结构:

ls -la /var/www/typecho/

应该能看到admin/install/usr/var/index.phpinstall.php这些文件和文件夹。

常见问题:

问题 解决方法
wget 下载太慢 Ctrl+C 终止,然后 apt install -y axelaxel,用 axel -n 4 下载链接 多线程下载
unzip: command not found sudo apt install -y unzip
cp: cannot stat 说明路径写错了,先用 ls -la 确认当前目录下确实有 adminvar 等文件夹,再执行复制命令
复制后 /var/www/typecho 是空的 检查是否用了 sudo,以及目标路径是否正确

清理临时文件:

rm -rf /tmp/build /tmp/typecho.zip

十、设置目录权限

权限这块容易搞错,我仔细说。

Web服务器的运行用户是www-data(Nginx和PHP-FPM默认都用这个用户),要让这个用户能读Typecho的所有文件,能写usr/目录(用来上传图片、安装主题插件)。

先把所有权给www-data

sudo chown -R www-data: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 {} \;

这两行是什么意思:-type d表示只处理目录,设置为755(所有者可读写执行,其他人可读执行);-type f表示只处理文件,设置为644(所有者可读写,其他人只读)。

usr/目录需要可写:

sudo chmod -R 775 /var/www/typecho/usr

775比755多了一个组内用户可写的权限,实际运行中PHP-FPM是以www-data用户执行的,这个权限足够。


十一、配置Nginx

Nginx的站点配置文件放在/etc/nginx/sites-available/,启用的时候在/etc/nginx/sites-enabled/里建一个软链接。

创建配置文件:

sudo nano /etc/nginx/sites-available/typecho

把下面这段内容贴进去。记得把your_domain.com换成你自己的域名,没有域名就直接填服务器的公网IP。

server {
    listen 80;
    server_name your_domain.com;
    root /var/www/typecho;
    index index.php;

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

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

    location ~ /(usr|admin)/.*\.(php|phtml)$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }
}

解释一下每块是干什么的:

  • listen 80:监听80端口,也就是HTTP的默认端口
  • server_name:匹配的域名,访问这个域名才会走这个配置
  • root:网站文件的根目录
  • index:默认入口文件,访问目录时自动找index.php
  • location /块:处理所有请求,try_files先找静态文件,找不到就交给index.php处理
  • location ~ \.php$块:处理PHP文件,通过socket方式传给PHP-FPM
  • 最后一个location:安全相关,限制usradmin目录下的PHP文件必须经过PHP-FPM处理,防止直接访问恶意脚本

保存后按Ctrl+X,按Y,再按Enter退出。

检查配置语法是否正确:

sudo nginx -t

显示test is successful就对了。如果有报错,根据提示修改。

禁用默认站点,启用我们刚创建的:

sudo rm -f /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/typecho /etc/nginx/sites-enabled/

重新加载Nginx让配置生效:

sudo systemctl reload nginx

十二、配置SSL证书和伪静态

网站搭好之后,可以配置HTTPS。现在主流浏览器对HTTP网站会标记“不安全”,配了SSL之后地址栏显示一把小锁。

前提条件

  1. 有一个已经解析到这台服务器IP的域名。免费证书不支持纯IP申请,必须绑定域名。
  2. 服务器80端口能正常访问。Let’s Encrypt在颁发证书时需要验证域名所有权,通过80端口访问服务器上的特定文件来完成验证。

安装Certbot

Certbot是Let’s Encrypt官方推荐的证书申请工具。

sudo apt install -y certbot python3-certbot-nginx

申请并安装证书(自动方式)

运行这条命令,Certbot会自动完成证书申请、安装、Nginx配置修改整套流程:

sudo certbot --nginx -d your_domain.com

your_domain.com换成你自己的域名。

第一次运行会让你填邮箱地址、同意服务条款。成功后Certbot会自动修改Nginx配置文件,添加HTTPS并配置HTTP跳转到HTTPS。

如果不想让Certbot自动改配置(手动方式)

先只申请证书:

sudo certbot certonly --nginx -d your_domain.com

证书会生成到/etc/letsencrypt/live/your_domain.com/

然后手动编辑Nginx配置,直接替换整个文件内容:

sudo nano /etc/nginx/sites-available/typecho

把下面内容贴进去,记得替换your_domain.com

server {
    listen 80;
    server_name your_domain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name your_domain.com;
    root /var/www/typecho;
    index index.php;

    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

    location / {
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php?$1 last;
        }
    }

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

    location ~ /(usr|admin)/.*\.(php|phtml)$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }
}

保存后按Ctrl+X,按Y,再按Enter退出。

注意:这里location /改成了if+rewrite方式,这就是Typecho的伪静态配置,配SSL的时候顺手就把伪静态一起配完了,后面不用再单独配置。

保存后检查并重载:

sudo nginx -t && sudo systemctl reload nginx

验证证书

浏览器访问https://你的域名,地址栏有小锁就成功了。

sudo certbot certificates

这个命令可以查看证书信息。

自动续期

Let’s Encrypt证书有效期90天,Certbot自带自动续期。

sudo systemctl status certbot.timer

显示active说明定时器正常运行,会自动续期。

如果不想配SSL

跳过这一步就行。纯HTTP也能正常访问,只是浏览器显示“不安全”,不影响博客功能。

若要配置伪静态,则修改Nginx配置:

sudo nano /etc/nginx/sites-available/typecho

location /块里改成这样:

location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?$1 last;
    }
}

十三、通过网页完成安装

前面的准备工作做完,现在可以打开浏览器了。

在浏览器地址栏输入你的域名或者服务器IP,正常会自动跳转到Typecho的安装页面。

如果页面顶部出现红色的错误提示,注意看提示内容:

  • “缺少xxx扩展”:回去用apt install php8.3-xxx补装对应的扩展,装完重启PHP-FPM
  • “目录不可写”:检查/var/www/typecho/usr目录的权限,执行sudo chmod 775那一步
  • “404 Not Found”:可能是Nginx配置的root路径不对,检查一下

没有错误的话,点击页面下方的"下一步"。

接下来进入数据库配置页面:

1.数据库适配器:选"SQLite原生函数适配器"

2.其他:数据库前缀和数据库文件路径保持默认的即可(SQLite的数据文件会存在这个目录下)

如果你前面选的是MySQL,这里要填数据库地址(localhost)、数据库名(typecho)、用户名(typecho_user)和密码。

然后填写管理员信息:

用户名:你登录后台用的账号(不要用admin这种太简单的)

密码:至少8位,大小写字母加数字组合

邮箱:用来接收评论通知、找回密码用的

填完之后点"确认",安装过程极快——因为SQLite只需要在usr/data目录下创建一个数据库文件,几乎没有等待时间。

安装成功后页面会显示一个初始密码(就是你刚填的那个)


十四、收尾和安全加固

安装完成之后,安装目录install/必须删除,不然别人可以通过/install.php重装你的博客,后果很严重。

sudo rm -rf /var/www/typecho/install

顺便把install.php也删了(其实它就在install目录下,但多检查一下没坏处):

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

现在访问 http://你的域名/admin,用刚才设置的用户名密码登录后台,就能开始写文章了。


十五、性能优化:开启PHP Opcache

Opcache是PHP内置的字节码缓存模块,能把PHP代码编译后的字节码存在共享内存里,下次请求同样的页面直接取缓存,不用重新编译。对于Typecho这种PHP程序,开启Opcache能减少大概30%-50%的CPU开销。

编辑Opcache配置文件:

sudo nano /etc/php/8.3/fpm/conf.d/10-opcache.ini

找到或者添加以下几行:

opcache.enable=1
opcache.memory_consumption=64
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.enable_cli=1

配置项说明:

  • opcache.enable=1:开启Opcache
  • opcache.memory_consumption=64:缓存占用的内存,64MB对Typecho完全够用
  • opcache.max_accelerated_files=4000:最多缓存4000个PHP文件,Typecho所有文件加起来不到1000个,这个值留了足够余量
  • opcache.revalidate_freq=60:每60秒检查一次文件是否有更新,开发调试阶段可以设短一点,生产环境设长一些提高性能
  • opcache.enable_cli=1:在命令行模式下也启用,执行php命令时也能享受缓存加速

保存后重启PHP-FPM:

sudo systemctl restart php8.3-fpm

十六、换主题和装插件

Typecho默认的主题比较朴素,想换个好看点的可以去Typecho官方社区找,或者搜"Typecho 主题推荐"。

安装主题的方法:

cd /var/www/typecho/usr/themes/
sudo git clone 主题的git地址

或者手动下载zip包然后解压到这个目录。

然后在后台 → 控制台 → 外观,就能看到新主题,点击启用就行。

插件的安装方式类似,放到/var/www/typecho/usr/plugins/目录,然后在后台 → 控制台 → 插件里面启用。


十七、常见问题排查

访问页面出现502 Bad Gateway

这个最常见的原因是PHP-FPM没有运行。检查一下:

sudo systemctl status php8.3-fpm

如果没启动就:

sudo systemctl start php8.3-fpm

如果启动了但还是502,检查Nginx配置里fastcgi_pass的socket路径是否正确。Ubuntu 24.04默认是unix:/var/run/php/php8.3-fpm.sock

访问页面直接下载php文件

说明Nginx没有把PHP请求转发给PHP-FPM。检查location ~ \.php$这个块是否被注释掉了,以及fastcgi_pass是否正确配置。

SQLite数据库无法写入

检查/var/www/typecho/usr/data/目录的权限,确保www-data用户有写权限:

sudo chown -R www-data:www-data /var/www/typecho/usr/data
sudo chmod 775 /var/www/typecho/usr/data

页面空白没有任何输出

打开PHP错误日志看看:

sudo tail -f /var/log/php8.3-fpm.log

如果有错误信息会显示在这里,根据提示处理即可。


十八、资源占用参考

我观察过这套组合的资源占用情况(以低配服务器为例,空载状态):

Nginx:大概15-25MB内存

PHP-FPM:主进程加上几个worker进程,总共60-80MB

SQLite:数据库文件本身几MB到几十MB,不单独占内存进程

加起来空载内存占用在100-130MB左右,对于512MB内存以上的机器都能流畅运行。

如果开了Opcache,会多占一些内存(配置里设了64MB),但换来的是PHP执行速度的大幅提升,这笔交换是划算的。


十九、写在最后

整套流程走下来大概半小时,从零到能登录后台开始写文章。我自己的博客现在就用这套方案跑了快两年,没出过什么大问题。

Typecho给我的感觉就是够用、不折腾——它没有WordPress那么多花哨功能,但写东西的核心体验做得很好。对于有一台低配服务器、想搭个干净博客的人来说,这个组合值得试试。

如果操作过程中遇到什么问题,可以把错误提示复制到搜索引擎里找一下,大部分问题别人都踩过坑了。