前言
最近想单独搭建博客,因为服务器性能一般,选择用轻量级的 Typecho。下面是搭建记录,搭建过程主要参考自 ChatGPT,博文主要总结自 ChatGPT 对话,补充中途遇到的部分问题。
1. 准备工作
前置基础:
- 一台服务器(我用的是腾讯云 OpenCloudOS,基于 CentOS)。
- 一个已解析到服务器 IP 地址的域名(例如
blog.example.site)。 - 预先已经配置好防火墙,80、443 端口已放开。
2. 安装与配置 PHP (含 PHP-FPM)
Typecho 是一个基于 PHP 的应用,需要 PHP 运行时和 PHP-FPM (FastCGI 进程管理器) 来处理动态请求。
2.1 安装 PHP 及常用扩展
使用dnf包管理器安装 PHP 及其 Typecho 所需的常用扩展:
dnf install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring php-json php-opcache php-curl
安装完成后,可以通过以下命令检查 PHP 版本:
php -v
2.2 启动并设置 PHP-FPM
启动php-fpm服务并设置开机自启:
systemctl enable php-fpm --now
确认php-fpm正在运行:
systemctl status php-fpm
2.3 确认 PHP-FPM 监听方式
默认情况下,PHP-FPM 会通过 Unix Socket 监听请求,通常路径为/run/php-fpm/www.sock。确认该文件是否存在:
ls /run/php-fpm/www.sock
一般路径是:
/run/php-fpm/www.sock
这个 Socket 路径将在后续 Nginx 配置中用到。
3. 安装与配置 MariaDB (MySQL)
Typecho 需要数据库来存储博客内容、用户数据等。这里我们选择 MariaDB。
3.1 安装并启动 MariaDB
dnf install -y mariadb-server
systemctl enable mariadb --now
3.2 初始化安全配置
强烈建议运行安全初始化脚本,设置root密码并移除不安全的默认项:
mysql_secure_installation
按照提示操作,通常建议选择:
- 设置
root密码:Y - 删除匿名用户:
Y - 禁止
root远程登录:Y - 删除
test数据库:Y - 重新加载权限表:
Y
3.3 创建 Typecho 数据库和用户
登录 MariaDB root用户:
mysql -u root -p
然后执行以下 SQL 命令,为 Typecho 创建数据库和专用用户。请将 '强密码' 替换为实际密码:
CREATE DATABASE typecho DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'typecho'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON typecho.* TO 'typecho'@'localhost';
FLUSH PRIVILEGES;
EXIT;
请记住数据库名 (typecho)、用户名 (typecho) 和密码,它们将在 Typecho 安装时使用。
4. 下载并部署 Typecho 程序
4.1 下载 Typecho
选择一个合适的网站根目录,例如/var/www/typecho:
mkdir -p /var/www/typecho
cd /var/www/typecho
下载最新版 Typecho 程序并解压:
curl -L https://github.com/typecho/typecho/releases/latest/download/typecho.zip -o typecho.zip
unzip typecho.zip
rm typecho.zip # 清理安装包
解压后,/var/www/typecho目录下应包含admin、install、usr、index.php等文件和目录。
4.2 设置文件权限
为了让 Nginx 和 PHP-FPM 能够正常读写 Typecho 文件,需要设置正确的属主和权限。Nginx 在 OpenCloudOS 上通常以nginx用户运行。
chown -R nginx:nginx /var/www/typecho
find /var/www/typecho -type d -exec chmod 755 {} \;
find /var/www/typecho -type f -exec chmod 644 {} \;
5. 配置 Nginx Web 服务器
5.2 安装并启动本地 Nginx
dnf install -y nginx
systemctl enable nginx --now
访问服务器 IP (http://你的服务器IP),如果看到 "Welcome to nginx!" 页面,说明 Nginx 已成功运行。
5.3 配置 Typecho 站点
创建 Nginx 站点配置文件:
vim /etc/nginx/conf.d/typecho.conf
将以下配置内容粘贴到文件中。将blog.example.site替换为实际域名:
server {listen 80;listen [::]:80;server_name blog.example.site;root /var/www/typecho;index index.php index.html;access_log /var/log/nginx/typecho.access.log;error_log /var/log/nginx/typecho.error.log;location / {try_files $uri $uri/ /index.php?$args;}location ~ \.php$ {include fastcgi_params;fastcgi_pass unix:/run/php-fpm/www.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}location ~* \.(jpg|jpeg|png|gif|css|js|ico|webp)$ {expires 30d;access_log off;}
}
5.4 检查并重载 Nginx 配置
nginx -t
systemctl reload nginx
这时候已经能够通过blog.example.site访问 Typecho 配置页了。但是在配置时遇到报错“上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后继续升级”。
6. 解决权限与 SELinux 问题
权限问题和 SELinux 是常见的部署障碍。上面的报错就是权限问题导致。
6.1 确保 PHP-FPM 以nginx用户运行
这是解决 Typecho 上传目录写入问题的关键。Nginx 进程通常以nginx用户运行,为了避免权限冲突,PHP-FPM 也应以相同的用户运行。
首先,确认php-fpm当前的运行用户:
ps -ef | grep php-fpm
如果worker进程不是nginx用户(通常为apache),需要修改 PHP-FPM 配置:
vim /etc/php-fpm.d/www.conf
找到并修改以下行,确保user和group为nginx,并配置listen.owner、listen.group和listen.mode以确保 Nginx 可以访问 Socket:
user = nginx
group = nginxlisten = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
修改后,重启 PHP-FPM 服务:
systemctl restart php-fpm
6.2 处理 SELinux (如果启用)
OpenCloudOS 默认启用 SELinux (Enforcing 模式),这会严格限制进程的文件访问权限。如果 SELinux 处于Enforcing状态,即使文件权限看起来正确,也可能导致 Typecho 无法写入上传目录。我这里没有开启(运行getenforce输出Disabled),就不记录了。
7. 完成 Typecho 初始化配置
现在,访问域名http://blog.example.site,应该会看到 Typecho 的安装页面。
7.1 填写数据库信息
按照页面提示填写数据库连接信息:
- 数据库适配器: 保持默认
PDO Mysql 适配器。 - 数据库前缀: 保持默认
typecho_。 - 数据库地址:
localhost。 - 数据库用户名:
typecho(之前创建的)。 - 数据库密码: 为
typecho用户设置的密码。 - 数据库名:
typecho(之前创建的)。
7.2 填写管理员信息
继续填写管理员账号信息:
- 管理员用户名: 希望的后台登录用户名。
- 管理员密码: 后台登录密码 (建议复杂且与数据库密码不同)。
- 管理员邮箱: 邮箱地址。
点击「确认,开始安装」。如果一切顺利,Typecho 将完成数据库表的创建和配置文件的写入,并提示安装成功。
7.3 安装后的重要操作
-
删除
install目录: 这是非常重要的安全步骤,防止他人重新安装或利用安装程序漏洞。rm -rf /var/www/typecho/install -
验证上传功能: 登录 Typecho 后台,尝试发布文章并上传图片,确认上传功能正常。
-
备份数据库: 首次安装成功后,建议立即备份数据库,作为初始干净状态的快照。
mysqldump -u typecho -p typecho > typecho_init.sql
8. 启用 HTTPS (Let's Encrypt)
我们使用 Certbot 自动申请和配置 Let's Encrypt 证书。
8.1 前置条件检查
在执行 Certbot 之前,需确保:
- 域名已正确解析到服务器 IP。
- Nginx 服务正在运行,且 80 端口可正常访问。
8.2 安装 Certbot 并申请证书
使用一条命令即可完成 Certbot 的安装、证书申请和 Nginx 配置:
dnf install -y certbot python3-certbot-nginx && certbot --nginx -d blog.example.site
在执行过程中,Certbot 会提示:
- 输入邮箱地址: 用于接收证书到期提醒。
- 同意服务条款: 输入
A。 - 是否接收 EFF 邮件: 可选,输入
N即可。 - 选择 HTTPS 行为: 强烈建议选择
2(Redirect),这将自动将所有 HTTP 请求重定向到 HTTPS。
如果一切顺利,将看到Congratulations! You have successfully enabled HTTPS on https://blog.example.site的提示。
8.3 验证 HTTPS
现在,访问https://blog.example.site,浏览器地址栏应显示安全锁图标,表明 HTTPS 已成功启用。
Certbot 会自动修改 Nginx 配置文件 (/etc/nginx/conf.d/typecho.conf),添加listen 443 ssl配置、证书路径和 HTTP 到 HTTPS 的重定向规则。它还会自动创建定时任务,确保证书在到期前自动续期。
运行下面的命令检查是否启动了定时任务,没有输出,定时任务应该是没有启动:
systemctl list-timers | grep certbot
运行下面的命令输入显示为禁用状态:
systemctl list-unit-files | grep certbot
certbot-renew.service static -
certbot-renew.timer disabled disabled
执行以下命令启动:
systemctl enable --now certbot-renew.timer
再次list-timers能够正常看到定时任务。
9. 基础安全加固与性能优化
9.1 Nginx 禁止上传目录执行 PHP 脚本
为了防止恶意用户上传 WebShell 等可执行脚本,应在 Nginx 配置中禁止uploads目录执行 PHP 文件。
编辑 Nginx 配置文件/etc/nginx/conf.d/typecho.conf,在server块内添加以下location规则:
location ~* ^/usr/uploads/.*\.(php|php5|phtml)$ {deny all;
}
添加后,测试并重载 Nginx 配置:
nginx -t && systemctl reload nginx
9.2 PHP-FPM / OPcache 性能调优
暂时没用到。