SzeYing's Blog SzeYing's Blog
SzeYing's Blog

从零搭建 Typecho:Ubuntu 22.04 + Nginx + PHP-FPM + SQLite + Cloudflare

目标:在已有 3x-ui/Xray 的 VPS 上部署 Typecho博客,支持后台写文章和上传图片,并配置 HTTPS。首要原则:保留现有3x-ui/Xray,不要擅自改动它的 443 端口。

  1. 本次环境与架构

系统:Ubuntu 22.04.5 LTS
VPS IP:103.61.139.134
博客域名:szeying.win
Typecho 目录:/var/www/szeying.win
HTTP Nginx 配置:/etc/nginx/sites-available/szeying.win
HTTP 启用链接:/etc/nginx/sites-enabled/szeying.win
HTTPS Nginx 配置:/etc/nginx/sites-available/szeying-https.conf
HTTPS 启用链接:/etc/nginx/sites-enabled/szeying-https.conf
PHP-FPM socket:/run/php/php8.1-fpm.sock
证书:/etc/letsencrypt/live/szeying.win/fullchain.pem
私钥:/etc/letsencrypt/live/szeying.win/privkey.pem
Nginx HTTP 监听 80;Nginx HTTPS 监听 8443;现有 Xray 占用443,之前也观察到 2053、2096 等端口。
systemctl is-active nginx x-ui 曾返回两个服务均 active。
ufw 当时为 inactive;这不代表云服务商防火墙一定放行了 8443。
https://szeying.win:8443 曾在浏览器正常打开,说明 Nginx 的 8443HTTPS 与证书本身可用。
不带端口的 https://szeying.win 曾返回 Cloudflare 526;切换Cloudflare SSL 模式为 Full 后出现 404。最终需要继续确认 Cloudflare的源服务器规则是否确实把源站端口改写到 8443。

预期请求路径:

浏览器 -> Cloudflare 橙色云代理 -> 源服务器规则将目标端口改为 8443

   -> Nginx HTTPS :8443 -> PHP-FPM 8.1 -> Typecho -> SQLite 数据库文件
  1. 术语解释

VPS:虚拟专用服务器,可理解为租来的、长期联网的 Linux 电脑。
Ubuntu:Linux 发行版;LTS 是长期支持版。
SSH / FinalShell:SSH 是远程加密登录协议;FinalShell是终端客户端。
域名:例如 szeying.win,方便访问网站。
DNS:把域名解析到 IP。A 记录指向 IPv4 地址;本例指向103.61.139.134。
Cloudflare 橙色云:流量经过 Cloudflare 代理;灰色云通常表示只做DNS 解析。
端口:区分同一服务器上的不同网络服务。80 通常用于 HTTP,443通常用于 HTTPS;本机 443 已被 Xray 使用。8443 是本次 Nginx HTTPS使用的备用端口。
Nginx:接收 HTTP/HTTPS 请求、提供静态文件,并把 PHP 请求转交PHP-FPM 的 Web 服务器。
PHP:Typecho 使用的服务端语言。
PHP-FPM:管理 PHP 进程的服务。Nginx 通过/run/php/php8.1-fpm.sock 这个 Unix socket 与它通信。
Typecho:轻量博客程序,提供文章、分类、评论、主题、插件和后台管理。
SQLite:轻量、文件型关系数据库,数据通常存放在单个数据库文件里,不需要像MySQL 那样额外运行一个数据库服务器。PHP 需要 SQLite扩展才能访问它。数据库文件包含文章、设置和用户数据,必须备份并防止被网站直接下载。
www-data:Ubuntu/Debian 常见的 Web
服务用户/组;上传目录需要给予网站进程适当写入权限。
Certbot:申请和续期 TLS 证书的客户端。
Let's Encrypt:免费证书颁发机构。
TLS 证书:帮助浏览器验证服务器身份并建立 HTTPS 加密连接。
fullchain.pem:证书链文件;privkey.pem:私钥,绝不能公开。
Cloudflare Full:浏览器到 Cloudflare、Cloudflare 到源站都用HTTPS,但不严格验证源站证书。
Full (strict):同样使用HTTPS,并严格验证源站证书;验证失败时可能出现 526。
源服务器规则(Origin Rule):可修改 Cloudflare发往源站的属性,例如目标端口。它和 SSL 模式是两件事;改 SSL模式不会自动把源站 443 改成 8443。
符号链接:类似快捷方式;sites-enabled 中的链接指向sites-available 中的实际配置文件。
HTTP 状态码:200 成功;301/302 重定向;403 禁止访问;404找不到资源;526 表示 Cloudflare 严格模式无法验证源站证书;502/504常见于上游不可用或超时。

  1. 安装软件
    更新软件包索引:sudo apt update
    sudo:用管理员权限执行。
    apt:Ubuntu 软件包管理工具。
    update:更新可用软件包索引,不等于升级所有软件。

    安装 Nginx:sudo apt install nginx
    install:表示安装软件包;nginx:是 Web 服务器。

    安装 PHP-FPM、SQLite 和常用扩展:
    sudo apt install php-fpm php-sqlite3 php-mbstring php-xml php-curl php-gd php-zip unzip
    php-fpm:运行 PHP 的 FPM 服务。
    php-sqlite3:让 PHP 使用 SQLite。
    php-mbstring:多字节字符串处理,对中文等字符很重要。
    php-xml:XML 处理功能。
    php-curl:让 PHP 发起 HTTP/HTTPS 请求。
    php-gd:图像处理功能。
    php-zip:ZIP 压缩文件功能。
    unzip:解压 ZIP 文件。

查看服务状态:
systemctl is-active nginx x-ui
systemctl status nginx --no-pager
systemctl status php8.1-fpm --no-pager
systemctl status x-ui --no-pager
systemctl:管理 systemd 服务;is-active:查询是否正在运行;status:显示状态与近期日志;--no-pager:让输出直接显示。部署后要确认 Nginx和现有 x-ui 都仍正常。

  1. 创建网站目录、上传目录和放置程序

sudo mkdir -p /var/www/szeying.win/usr/uploads
sudo chown -R www-data:www-data /var/www/szeying.win/usr/uploads

mkdir:创建目录;-p:连同不存在的父目录一起创建,目录已存在时通常不会报错。
/var/www/szeying.win:本博客站点根目录。
usr/uploads:Typecho 常用的上传文件目录。
chown:修改所有者;-R:递归处理目录内内容;www-data:www-data表示用户和组都设为 www-data。
只对确实需要网站写入的目录授权,不要把所有文件都设置为任何人可写。

本次记录确认 Typecho ZIP 放在 /tmp/typecho.zip并解压到站点目录。早期终端历史没有完整保留下载 URL和确切解压命令,因此这里不编造原样命令。/tmp 是临时目录;ZIP是压缩格式。解压后应确认站点根目录有 index.php、install.php 等Typecho 文件。

  1. Nginx HTTP 配置

配置文件:/etc/nginx/sites-available/szeying.win\
启用链接:/etc/nginx/sites-enabled/szeying.win
本次关键配置(HTTP-01 证书验证例外已加入):
微信图片_20261029140956_144_49.png

逐行解释:

server { ... }:定义一个虚拟主机。
listen 80;:监听 IPv4 HTTP 80 端口;listen [::]:80; 是 IPv6。
server_name szeying.win;:该站点响应的域名。
root:网站文件根目录。
index index.php index.html;:访问目录时寻找的默认首页。
access_log:访问日志;error_log:错误日志。
client_max_body_size 20m;:限制请求体大小约 20MB,影响上传文件大小。
location:定义 URL 匹配规则。
location ^~ /.well-known/acme-challenge/:优先处理 Let's Encrypt验证目录。
default_type "text/plain";:验证文件按纯文本返回。
try_files $uri =404;:文件存在则返回,不存在则 404。
location /:一般网页请求的规则。
try_files $uri $uri/ /index.php?$args;:先尝试文件,再尝试目录;都不存在时交给Typecho 的 index.php,并保留查询参数。
location ~ \.php$:匹配以 .php 结尾的请求。
include snippets/fastcgi-php.conf;:载入系统提供的 PHP-FPM参数配置。
fastcgi_pass unix:/run/php/php8.1-fpm.sock;:把 PHP 请求交给PHP-FPM。
location ~ /\. 和 deny all;:拒绝访问隐藏文件,减少泄露 .git等内容的风险。
location ~ ^/usr/(uploads|themes|plugins)/.\.php$:禁止上传、主题、插件目录中的PHP 文件被直接执行;~* 不区分大小写,| 表示"或",.*表示任意字符序列,\.` 在正则中表示字面点号。
之前 Certbot 验证出现 403,原因与隐藏文件规则拦截 /.well-known/...有关。加入 ACME 例外后,证书申请成功。

上一篇 已经是第一篇了
下一篇 SezYing's CV(简体中文)

暂无评论

评论已关闭

还没有评论,来说点什么吧

@SzeYing Official
Theme Robes