我的个人博客

其架构

互联网
   │
   ▼
lutiehao.xyz
   │
   ▼
腾讯 DNS / 以后可换 Cloudflare
   │
   ▼
腾讯云 Rocky Linux 9.x
   │
   ▼
Nginx :80 / :443
   │
   ▼
PHP-FPM
   │
   ▼
Typecho
   │
   ▼
MariaDB

这里的LNMP就是:

L = Linux            Rocky Linux
N = Nginx            Web服务器
M = MariaDB                数据库
P = PHP                动态程序运行环境

Typecho是运行在这套LNMP上的应用。

提供个人博客的页面模版等。

这次让Nginx和PHP-FPM使用Rocky默认的Unix Socket

/run/php-fpm/www.sock

Rocky官方文档本身就是把这个socket作为默认配置;同机运行Nginx与PHP-FPM时使用Unix socket也省掉了一层TCP/IP通信。

整个项目分为9个阶段

个人博客部署 —— Rocky Linux + LNMP + Typecho

0. 环境检查
1. Rocky Linux 基础初始化
2. 安装和配置 Nginx
3. 安装和配置 PHP / PHP-FPM
4. 安装和配置 MariaDB
5. 创建 Typecho 数据库和用户
6. 部署 Typecho
7. 配置 Nginx 虚拟主机
8. 网站测试、备案后上线
9. HTTPS、安全、备份、Cloudflare

第 0 步:确认快照恢复后的服务器状态

① 确认操作系统

cat /etc/os-release

这个告诉我们:

Rocky Linux ?
VERSION_ID=?

image-20260811194035881

② 看内核

uname -r

截屏2026-08-11 19.41.51

③ 看服务器资源

free -h

这是看内存。

然后:

df -hT /

这是看根文件系统磁盘空间。

截屏2026-08-11 19.42.37

④ 检查 SELinux

getenforce

截屏2026-08-11 19.45.31

这次不为了省事执行setenforce 0。

所以需要永久修改配置文件/etc/selinux/config。

截屏2026-08-11 19.47.50

顺便补充临时修改

# 临时切换为宽容模式
setenforce 0

# 临时切换为强制模式
setenforce 1

⑤ 看 Nginx 是否还存在

rpm -q nginx

截屏2026-08-11 19.51.55

⑥ 检查 PHP

rpm -q php php-fpm

⑦ 检查 MariaDB

rpm -q mariadb-server

均未安装

⑧ 最后看有没有遗留 Nginx 配置

ls -la /etc/nginx/conf.d 2>/dev/null

无

这一阶段需要理解什么?

环境盘点/Baseline Check

真正运维时拿到一台机器,应该先知道

我在哪台机器?
什么系统?
什么版本?
资源多少?
安全机制什么状态?
已经装了什么?
有没有历史配置?

第 1 阶段:服务器基础初始化

1.1 先理解这台机器的资源

内存:1.9G
Swap:0

博客本身很轻,但以后同时运行

Nginx
PHP-FPM
MariaDB
Typecho

再加上系统服务,2GB 内存够用,但没有 Swap 时,如果某个进程突然吃满内存,Linux 只能更激进地杀进程。

所以我们先给它加一个 2GB Swap。

Swap:硬盘上的交换空间。当物理内存压力较大时,Linux 可以暂时把部分不活跃内存页移到 Swap。Swap 不能代替真正的内存,但可以提高小内存服务器面对突发内存压力时的容错能力。

1.2 创建 2GB Swap

确认确实没有

swapon --show

没有输出,即为没有

创建

fallocate -l 2G /swapfile

查看:

ls -lh /swapfile

修改权限

chmod 600 /swapfile

检查

ls -l /swapfile

截屏2026-08-11 20.08.28

为什么要修改权限为仅root用户读写?

Swap里可能包含曾经位于内存里的数据,所以不能让普通用户随意读取

格式化成 Swap

mkswap /swapfile

这里其实和格式化磁盘有点像:

普通文件
/swapfile
   ↓
mkswap
   ↓
Linux可以识别的Swap区域

然后启用:

swapon /swapfile

验证:

swapon --show

再

free -h

截屏2026-08-11 20.13.13

可以看到从Swap:0B变到Swap:2.0Gi

1.3 让 Swap 重启后依然存在

永久修改配置文件

vim /etc/fstab

在最后添加:

/swapfile swap swap defaults 0 0

截屏2026-08-11 20.16.46

重要知识

/etc/fstab是Linux用来描述:

系统启动时应该自动挂载哪些文件系统/交换空间

的配置文件。

错误修改可能导致机器启动异常

所以修改后验证

mount -a

没有报错即没有问题

1.4 检查系统时间

执行:

timedatectl

主要看Time zone

截屏2026-08-11 20.22.48

确认为Asia/Shanghai(CST,+0800)即正常

如果不是可以设置

timedatectl set-timezone Asia/Shanghai

再

timedatectl

服务器时间重要,因为后期查看大量日志,如果时区不对,排障会很难对上

1.5 检查软件源

执行:

dnf repolist

我们需要确认 Rocky 的软件源正常。

然后:

dnf makecache

它的意思不是安装软件,而是:

把软件仓库的元数据信息缓存下来。

截屏2026-08-11 20.26.12

1.6 检查网络和防火墙,但先不修改

执行:

ip addr

截屏2026-08-11 20.27.51

这里有一个很值得学习的现象:

我的腾讯公网IP是:

124.222.7.119

但ip addr不一定能看到124.222.7.119

所以后面配置时不能让PHP-FPM:

listen = 124.222.7.119:9000

云服务器经常存在:

互联网
   ↓
腾讯云公网IP
124.222.7.119
   ↓
云网络/NAT
   ↓
你的Linux虚拟网卡
   ↓
内网IP

这一点现在重新搭建以后就能真正理解了。

然后检查 firewalld:

systemctl status firewalld --no-pager

截屏2026-08-11 20.31.57

目前为关闭状态,先不管

此阶段小总结

服务器配置

Rocky Linux 9.4
2C2G
50GB
SELinux Enforcing

Swap

fallocate -l 2G /swapfile            →创建
chmod 600 /swapfile                        →修改权限
mkswap /swapfile                            →格式化
swapon /swapfile                            →检查

永久挂载

/etc/fstab

/swapfile swap swap defaults 0 0

查看

free -h            → 内存怎么样?
swapon --show      → Swap有没有启用?
timedatectl        → 时间/时区怎么样?
dnf repolist       → 软件源怎么样?
ip addr            → 网卡/IP怎么样?
systemctl status   → 服务运行了吗?

第 2 阶段:安装 Nginx

2.1 安装 Nginx

执行:

dnf install nginx -y
dnf install nginx:通过 Rocky Linux 的软件仓库安装 Nginx,并由 RPM 包管理器记录软件文件、依赖和版本信息。

Rocky官方的DNF文档就是把DNF作为系统的软件包管理方式;Nginx也可以通过软件包方式安装。

确认

rpm -q nginx

截屏2026-08-11 20.42.50

2.2 看看 Nginx 被安装到了哪里

执行

nginx -V

image-20260811204457085

再执行:

rpm -ql nginx | less

这个命令的意思:

rpm
 |
 |-q   query 查询
 |
 `-l   list files 列出文件

也就是:

“这个 nginx RPM 包到底往系统里安装了哪些东西?”

截屏2026-08-11 20.46.15

以后想知道软件安装到哪了,可以先想到:

rpm -ql 软件包名

这对RHEL/Rocky系非常实用

2.3 认识我们以后主要用到的几个目录

重点关注:

/etc/nginx/
    ↓
Nginx 配置


/etc/nginx/nginx.conf
    ↓
Nginx 主配置文件


/etc/nginx/conf.d/
    ↓
我们以后自己的站点配置


/var/log/nginx/
    ↓
Nginx 日志

网站文件这次不打算全都堆在Nginx默认欢迎页目录里

给自己的服务规划

/var/www/

├── blog/           ← 现在的个人博客
│
└── cloud/          ← 以后个人网盘再考虑

这样以后:

Nginx配置:

/etc/nginx/conf.d/blog.conf
/etc/nginx/conf.d/cloud.conf

对应

网站文件:

/var/www/blog
/var/www/cloud

网盘以后再建。

2.4 创建博客网站目录

执行:

mkdir -p /var/www/blog

查看:

ls -ld /var/www/blog

截屏2026-08-11 20.54.53

现在目录是空的。

创建第一个真正属于你的网站页面:

vim /var/www/blog/index.html

随便写点

保存并确认:

cat /var/www/blog/index.html

截屏2026-08-11 20.56.59

2.5 现在启动 Nginx

执行:

systemctl enable --now nginx

这里同时做了两件事:

启动Nginx服务

设置开机自动启动

检查

systemctl status nginx --no-pager

截屏2026-08-11 21.00.16

2.6 不急着打开浏览器,先看它到底监听没监听

执行:

ss -lntp | grep nginx

可以看到

截屏2026-08-11 21.01.50

这里

0.0.0.0:80

不是服务器IP

意思是:

Nginx 在所有 IPv4 网络接口的 TCP 80 端口上监听。

而:

127.0.0.1:80

则意味着:

只能服务器自己访问。

2.7 先在服务器内部测试 Nginx

执行:

curl -I http://127.0.0.1

-I 的意思是只看 HTTP 响应头。

截屏2026-08-11 21.03.46

由此结果,已经可以证明

Linux本机
   ↓
127.0.0.1:80
   ↓
Nginx

是通的

但现在看到的还只是Rocky自带的Nginx默认页面,不是我们/var/www/blog/index.html

因为我们还没告诉 Nginx:

“我的博客文件在 /var/www/blog。”

这正是下一步。

2.8 给自己的博客创建虚拟主机

创建:

vim /etc/nginx/conf.d/blog.conf

现在只写一个纯静态站点配置:

server {
    listen 80;

    server_name 124.222.7.119 lutiehao.xyz www.lutiehao.xyz;

    root /var/www/blog;

    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

逐行理解这个配置文件

server {}

server {
}

表示:

一个虚拟 Web 站点。

以后完全可以同时有:

blog.conf
    ↓
博客

cloud.conf
    ↓
个人网盘

monitor.conf
    ↓
Grafana

它们都由同一个 Nginx 提供服务。


listen 80;

listen 80;

意思:

这个网站接收 TCP 80 上的 HTTP 请求。

以后 HTTPS 会增加:

listen 443 ssl;

现在不碰。


server_name

server_name 124.222.7.119 lutiehao.xyz www.lutiehao.xyz;

意思:

这些 Host 请求属于这个站点。

所以目前可以用:

http://124.222.7.119
http://lutiehao.xyz
http://www.lutiehao.xyz

进入同一个博客配置。

这样我们不需要现在写:

server_name _;

也就不会再次和 Rocky 默认配置里的 _ 打架。


root

root /var/www/blog;

这就是:

网站根目录。

例如浏览器请求:

/index.html

Nginx 就会去找:

/var/www/blog/index.html

这也是上次你遇到 File not found 时一直在排查的核心概念:

URL路径
+
root
=
服务器上的实际文件

index

index index.html;

意思:

访问:

http://124.222.7.119/

而没有指定文件时,优先找:

index.html

try_files

try_files $uri $uri/ =404;

现阶段理解成:

优先寻找用户请求的真实文件或目录,找不到就返回 404。

以后 Typecho 阶段我们会把这里改成支持 Typecho 路由的写法。

现在不提前改。

2.9 每次改 Nginx 配置后,都养成这个习惯

千万别写完就直接 reload。

先:

nginx -t

我们希望看到这个结果

截屏2026-08-11 21.14.20

nginx -t 就是:

先测试配置,不真正应用。

测试成功后

systemctl reload nginx

2.10 在服务器内部测试“我们的站点”

执行:

curl http://127.0.0.1 -H 'Host: 124.222.7.119'

这里故意加了:

Host: 124.222.7.119

因为我们要告诉 Nginx:

我要访问 server_name 124.222.7.119 那个虚拟主机。

成功后,可以直接看到

截屏2026-08-11 21.17.26

这一刻意味着

curl
 ↓
Nginx
 ↓
匹配 blog.conf
 ↓
root /var/www/blog
 ↓
index.html

已经全部正常。

2.11 最后才从公网访问

先确认腾讯云轻量服务器防火墙仍然有:

TCP
80
全部 IPv4
允许

image-20260811211919792

然后浏览器访问

http://124.222.7.119

成功的话可以看到

image-20260811214647792

此阶段小结

需要能够回答

为什么输入一个 IP 可以看到网页?

因为:

IP找到服务器
→ 80找到Nginx
→ server_name找到server块
→ root找到网站目录
→ index找到index.html
→ Nginx把文件通过HTTP返回给浏览器

这样才真正理解静态Web服务

第 3 阶段:PHP + PHP-FPM

3.1 先理解 PHP 在 LNMP 里的位置

刚才的静态网页

浏览器
   ↓
Nginx
   ↓
index.html
   ↓
直接返回给浏览器

因为HTML本身不需要“运行”

但Typecho的核心文件是:

index.php
admin/*.php
...

Nginx不会执行PHP

所以动态页面的链路会变成:

浏览器
   ↓
Nginx
   ↓
发现请求的是 .php
   ↓
FastCGI
   ↓
PHP-FPM
   ↓
PHP解释器执行程序
   ↓
生成 HTML
   ↓
Nginx
   ↓
浏览器

这里特别重要:

Nginx负责接请求,PHP-FPM负责执行PHP。

以后看到:

502 Bad Gateway
File not found
PHP源码直接显示

就应该从这条链路判断问题在哪。


3.2 安装 PHP 和 PHP-FPM

执行:

dnf install php php-fpm -y

安装后执行

php -v            #查看PHP CLI版本

这里的 CLI 是:

Command Line Interface,命令行模式。

截屏2026-08-11 21.54.40

也就是说现在已经可以:

php xxx.php

在命令行执行 PHP,但 Nginx 还不能执行它。

3.3 认识 PHP-FPM 的配置,但现在不修改

先执行:

grep -E '^(user|group|listen|listen\.acl_users)' /etc/php-fpm.d/www.conf

截屏2026-08-11 21.58.25

listen

listen = /run/php-fpm/www.sock

意思是:

PHP-FPM 创建一个 Unix Socket,等待 Nginx 把 PHP 请求送进来。

它不是 TCP 端口。

listen.acl_users

listen.acl_users = apache,nginx

表示允许:

apache
nginx

这些用户访问这个 socket。

你的 Nginx worker 是 nginx 用户,所以已经处理好了权限。

我们不改它。

3.4 启动 PHP-FPM

执行:

systemctl enable --now php-fpm

检查:

systemctl status php-fpm --no-pager

截屏2026-08-11 22.01.30

3.5 验证 socket 真的存在

这一步非常重要。

执行:

ls -l /run/php-fpm/www.sock

image-20260811220320087

最前面的s表示socket文件

-rw-r--r--   普通文件
d           目录
l           软链接
s           socket

再执行

ss -lx | grep php

-x 表示查看 Unix socket。

截屏2026-08-11 22.05.22

应该能看到 PHP-FPM 在监听。

3.6 修改现有的 blog.conf

前面已经创建了

/etc/nginx/conf.d/blog.conf

以后一个博客就主要维护一个blog.conf

打开

vim /etc/nginx/conf.d/blog.conf

修改为

server {
    listen 80;

    server_name 124.222.7.119 lutiehao.xyz www.lutiehao.xyz;

    root /var/www/blog;

    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi.conf;
        fastcgi_pass unix:/run/php-fpm/www.sock;
    }
}

3.7 一行一行理解新增内容

第一处

原来:

index index.html;

现在:

index index.php index.html;

意思是:

访问:

/

Nginx依次寻找:

index.php
   ↓ 没有

index.html
   ↓ 找到

所以你现在的静态网页不会消失。

以后 Typecho 放进来之后有 index.php,自然优先执行 Typecho。


第二处

location ~ \.php$ {

这里:

~

表示使用正则表达式匹配。

\.php$

大致表示:

以 .php 结尾的请求。

所以:

/index.php        ✅
/test.php         ✅
/abc.html         ❌
/logo.png         ❌

HTML、CSS、图片仍然直接由 Nginx 返回。


第三处

include /etc/nginx/fastcgi.conf;

这是 FastCGI 参数。

其中一个非常关键的作用就是告诉 PHP-FPM:

你应该执行服务器上的哪个 PHP 文件。

这次我们不用手写你上次出错的:

fastcgi_param SCRIPT_FILENAME ...

直接使用发行版提供好的:

/etc/nginx/fastcgi.conf

第四处

fastcgi_pass unix:/run/php-fpm/www.sock;

这是整个配置最核心的一句:

Nginx
   │
   │ 把PHP请求交过去
   ▼
/run/php-fpm/www.sock
   │
   ▼
PHP-FPM

3.8 先测试 Nginx 配置

还是我们的固定动作:

nginx -t

必须看到:

syntax is ok
test is successful

然后:

systemctl reload nginx

截屏2026-08-11 22.16.33

这条以后形成肌肉记忆:

修改
 ↓
nginx -t
 ↓
成功
 ↓
reload

3.9 创建一个最简单的 PHP 测试文件

这次不用 phpinfo()。

因为 phpinfo() 会把服务器 PHP 配置、模块、路径等大量信息暴露出来,不适合公网服务器长期存在;Rocky 官方也特别提醒测试完要删除这类页面。

我们创建:

vim /var/www/blog/test.php

只写:

<?php
echo "PHP is working!";
?>

保存。

查看:

cat /var/www/blog/test.php

截屏2026-08-11 22.19.05

3.10 先不用浏览器,服务器内部测试

执行:

curl -H 'Host: 124.222.7.119' http://127.0.0.1/test.php

截屏2026-08-11 22.20.22

这里发生了什么?

Nginx
   ↓
识别 .php
   ↓
PHP-FPM
   ↓
执行 PHP
   ↓
echo
   ↓
Nginx返回结果

LNMP里的P层已经打通

3.11 再从 Mac 浏览器测试

访问:

http://124.222.7.119/test.php

可以看到

截屏2026-08-11 22.23.23

3.12 再检查日志

即使成功,也建议看一次:

tail -20 /var/log/nginx/access.log

可以看到

image-20260811222644600

再

tail -20 /var/log/nginx/error.log

正常没有新错误

PHP-FPM 日志:

journalctl -u php-fpm -n 20 --no-pager

截屏2026-08-11 22.28.34

这一步是培养一个非常重要的习惯:

服务正常也要知道日志在哪。

3.13 最后删除测试 PHP

确认浏览器测试成功后:

rm /var/www/blog/test.php

为什么删?

因为:

测试文件
≠
生产网站需要的文件

上线服务器应该尽量减少不必要的入口。

此阶段小结

HTTP 请求 /test.php
        │
        ▼
      Nginx
        │
        │ location ~ \.php$
        ▼
 /run/php-fpm/www.sock
        │
        ▼
     PHP-FPM
        │
        ▼
 /var/www/blog/test.php
        │
        ▼
  PHP解释并执行
        │
        ▼
 "PHP is working!"
        │
        ▼
      Nginx
        │
        ▼
      浏览器

几个配置文件的职责

/etc/nginx/conf.d/blog.conf
→ Nginx如何处理博客请求

/etc/php-fpm.conf
→ PHP-FPM全局配置

/etc/php-fpm.d/www.conf
→ PHP-FPM的www进程池配置

/run/php-fpm/www.sock
→ Nginx和PHP-FPM之间的Unix Socket

特别记住:

www.sock 是运行时产生的,不是你手工创建的。

系统重启后它会重新生成。

第 4 阶段:安装和配置 MariaDB

本阶段目标

MariaDB 服务
    ↓
只允许本机使用
    ↓
创建 typecho 数据库
    ↓
创建专用 typecho 用户
    ↓
验证这个用户能正常登录数据库

4.1 先理解 LNMP里的M

现在已经完成:

L → Rocky Linux            ✅
N → Nginx                  ✅
P → PHP + PHP-FPM          ✅
M → MariaDB                ← 现在

Typecho 的页面、文章、用户等数据不是全部直接写在 PHP 文件里的,而是需要数据库保存。

以后大致是:

访问博客
   ↓
Nginx
   ↓
PHP-FPM
   ↓
Typecho
   ↓
MariaDB
   ↓
查文章/用户/配置
   ↓
Typecho生成HTML
   ↓
返回浏览器

Rocky Linux 9 可以直接通过 DNF 安装 mariadb-server,并使用 systemd 管理它。


4.2 安装 MariaDB

执行:

dnf install mariadb-server -y

安装完成先看版本:

mariadb --version

再确认 RPM:

rpm -q mariadb-server

截屏2026-08-11 22.48.54

mariadb
→ MariaDB 客户端命令

mariadb-server
→ 真正运行数据库服务的服务端软件

4.3启动数据库

执行:

systemctl enable --now mariadb

检查:

systemctl status mariadb --no-pager

截屏2026-08-11 22.51.25

4.4 看看数据库监听在哪里

执行:

ss -lntp | grep 3306

MariaDB 默认 TCP 端口是:

3306

image-20260811225333676

这里的*为通配符,*:3306可以理解为:

MariaDB 正在监听所有可用网络接口的 3306 端口。

而我的博客架构里,MariaDB只需要让本机的PHP/Typecho连接,不需要让互联网直接访问数据库。所以更适合限制成:

127.0.0.1:3306

所以现在要修改

创建一个单独的本地配置文件:

vim /etc/my.cnf.d/99-local.cnf

写入:

[mysqld]
bind-address=127.0.0.1

保存后先检查一下:

cat /etc/my.cnf.d/99-local.cnf

截屏2026-08-11 23.12.22

然后重启MariaDB

systemctl restart mariadb

确认服务没挂:

systemctl status mariadb --no-pager

截屏2026-08-11 23.14.04

再查:

ss -lntp | grep 3306

截屏2026-08-11 23.15.05

已经变为127.0.0.1:3306

此时只会监听本机回环接口

外部主机无法直接连接

腾讯云防火墙也不要添加 3306 入站规则。

这就是一个非常重要的安全原则:

需要公网访问:
80   HTTP
443  HTTPS
22   SSH

不需要公网访问:
3306 MariaDB

4.5 做 MariaDB 安全初始化

执行:

mariadb-secure-installation

如果提示命令不存在,再用:

mysql_secure_installation

很可能会遇到类似这些问题。

第一次:

Enter current password for root (enter for none):

这是刚安装好的数据库:

直接回车。

然后可能出现:

Switch to unix_socket authentication [Y/n]

选:

Y

或者直接回车接受默认 Y。

这里非常值得记笔记。

MariaDB 10.4+ 默认支持 unix_socket 身份认证,也就是说数据库可以根据当前 Linux 用户身份认证管理员;因此本机 Linux root 可以管理 MariaDB,而不必把一个数据库 root 密码暴露给应用程序。

如果接下来问:

Change the root password? [Y/n]

这套部署里可以:

n

我们使用 socket 认证管理数据库,Typecho 更不会使用 root。

接下来这些都选:

Remove anonymous users?
Y

Disallow root login remotely?
Y

Remove test database and access to it?
Y

Reload privilege tables now?
Y

这些分别是在:

删除匿名账户
禁止数据库 root 远程登录
删除测试数据库
立即重新加载权限

Rocky 官方的 MariaDB 安全初始化指南同样建议删除匿名用户、禁止 root 远程登录、删除 test 数据库并重新载入权限。

4.6 第一次进入 MariaDB

现在直接:

mariadb

如果 socket 认证正常,你作为 Linux root 应该直接进去:

Welcome to the MariaDB monitor.

MariaDB [(none)]>

截屏2026-08-11 23.21.24

这里MariaDB [(none)]>是

MariaDB SQL 命令行

从这一刻开始敲的不是Linux命令,而是 SQL。

输入

show databases;

可以看到系统自带数据库

截屏2026-08-11 23.24.52

4.7 创建属于 Typecho 的数据库

现在在:

MariaDB [(none)]>

里面执行:

CREATE DATABASE typecho
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

这里解释一下。

数据库名字:

typecho

字符集:

utf8mb4

utf8mb4 可以完整保存 Unicode 字符,包括中文以及 Emoji 等字符。

检查:

SHOW DATABASES;

截屏2026-08-11 23.28.28

4.8 不让 Typecho 使用 root

这一步特别重要。

不要以后 Typecho 安装界面这样填:

数据库用户:root

我们要创建:

Linux root
    ↓
管理整个服务器

MariaDB root
    ↓
管理整个数据库服务器

typecho 用户
    ↓
只管理 typecho 数据库

这叫:

最小权限原则

即使 Typecho 日后出现安全问题,攻击者拿到这个数据库账号,也只能操作:

typecho

而不是整个 MariaDB。


创建 Typecho 数据库用户

现在自己准备一个独立的强密码。

不要用:

  • 腾讯云 root 密码
  • SSH密码
  • 阿里云密码
  • 其他账户密码

然后在 MariaDB 中执行:

CREATE USER 'typecho'@'localhost'
IDENTIFIED BY '这里换成你自己的数据库密码';

例如结构上是:

typecho
   @
localhost

含义非常重要:

typecho 这个数据库账户只能从服务器本机连接。

不是互联网任意主机。

额外补充

在MariaDB命令行中可能会因为单双引号未闭合等原因卡在

>

中退不出来

这是是因为MariaDB认为:

你这条SQL还没输入完

所以下一行继续等待输入

遇到这种情况可以直接输入:

\c

它会取消当前这条还没执行的SQL,重新回答:

MariaDB [(none)]>

刚刚因为这个问题我重新设置了用户密码

可以进行验证是否成功创建,在MariaDB中输入

SELECT User, Host
FROM mysql.user
WHERE User='typecho';

截屏2026-08-12 00.16.30

验证创建的用户和密码是否正确,直接用密码登陆。

先从当前 MariaDB 管理会话退出:

EXIT;

然后在 Linux Shell 里执行:

mariadb -u typecho -p

出现:

Enter password:

输入设置的密码

截屏2026-08-12 00.19.36

成功登陆

然后再执行:

SELECT CURRENT_USER(), USER();

截屏2026-08-12 00.20.55

这里有两个概念

USER()
→ 你是以什么身份发起连接的

CURRENT_USER()
→ MariaDB 最终用哪个账户完成权限认证

接下来检查它是不是能访问博客数据库:

先退出到root,重新用maraidb登陆为数据库管理员,然后

USE typecho;

应该:

Database changed

然后:

SHOW TABLES;

现在还没装 Typecho,所以正常应该是:

Empty set

最后检查权限:

SHOW GRANTS FOR CURRENT_USER;

截屏2026-08-12 00.27.18

这就同时验证了四件事:

账户:typecho@localhost                ✅
密码:第二次设置的密码                        ✅
数据库:typecho                                ✅
权限:只管理 typecho.*                ✅

还可以顺手验证一下“最小权限原则”。回到 typecho 用户登录状态,执行:

CREATE DATABASE test123;

应该报类似:

ERROR 1044/1045 ... Access denied

这反而是正确结果,因为我们不希望博客账户拥有创建其他数据库的权限。

截屏2026-08-12 00.31.10

然后:

EXIT;

如果上面全部通过,MariaDB 这部分就可以彻底收工,不再修改账户配置了。

4.9用户授权

创建用户 ≠ 有权限

正确授权:

GRANT ALL PRIVILEGES
ON typecho.*
TO 'typecho'@'localhost';

含义:

拆开:

ALL PRIVILEGES

允许:

  • 创建表
  • 修改表
  • 插入数据
  • 查询数据

typecho.*

重点!

不是:

*.*

而是:

数据库名.所有表

也就是:

typecho数据库
    |
    ├── typecho_options
    ├── typecho_contents
    ├── typecho_users
    └── ...

只能管理这里。


localhost

表示:

只能本机连接:

服务器内部

Typecho程序
    |
    |
localhost
    |
MariaDB

而不是:

互联网
 |
 |
MariaDB:3306

这也是安全设计。

截屏2026-08-12 00.59.18

4.10 刷新权限

执行:

FLUSH PRIVILEGES;

作用:

让 MariaDB 重新加载权限表。

虽然 MariaDB 新版本很多授权操作会自动生效,但习惯上生产环境仍保留这个步骤。

截屏2026-08-12 01.00.53

4.11 用普通用户测试登陆

以用户身份登陆MariaDB

mariadb -u typecho -p

然后:

USE typecho;

成功:

Database changed

截屏2026-08-12 01.03.33

说明:用户➡️密码➡️权限➡️数据库 全部正常

4.12 安全检查

检查 MariaDB 监听地址

执行:

ss -lntp | grep 3306

截屏2026-08-12 01.06.08

只允许监听本机

MariaDB不会暴露公网。

此阶段小结

第四阶段:MariaDB部署与安全配置

4.1 安装MariaDB
    ✅ MariaDB 10.5.29

4.2 启动服务
    ✅ mariadb.service running

4.3 初始化安全配置
    ✅ 删除匿名用户
    ✅ 禁止root远程登录
    ✅ 删除测试数据库

4.4 创建博客数据库

    CREATE DATABASE typecho;


4.5 创建博客专用用户

    CREATE USER
    'typecho'@'localhost'
    IDENTIFIED BY '密码';


4.6 用户授权

    GRANT ALL PRIVILEGES
    ON typecho.*
    TO 'typecho'@'localhost';


4.7 权限验证

    SHOW GRANTS

    结果:
    typecho.*权限正常


4.8 数据库监听安全

    3306监听:

    127.0.0.1:3306

    只允许本机访问


第四阶段完成 ✅

第五阶段:完善PHP运行环境

5.1 安装PHP扩展

dnf install php-mysqlnd php-curl php-mbstring -y

5.2 重启 PHP-FPM

现在执行:

systemctl restart php-fpm

为什么需要?

因为:

安装扩展只是:

磁盘上出现模块文件

但是:

正在运行的 PHP-FPM

还是旧进程。

所以需要重新加载:

旧PHP-FPM
       ↓
停止
       ↓
启动
       ↓
加载新扩展

截屏2026-08-12 14.43.26

5.3 查看 PHP 模块

接着执行:

php -m | grep -E "mysqli|pdo_mysql|curl|mbstring"

截屏2026-08-12 14.45.09

正常

解释一下:

curl

PHP访问网络:

例如:

PHP
 |
 |
外部API

mbstring

中文支持:

博客一定需要。

例如:

文章:

你好,SRE学习笔记

如果没有:

可能出现乱码。

mysqli

PHP连接MariaDB的一种方式。

pdo_mysql

另一种数据库接口。

现代 PHP 应用更常用 PDO。

5.4 为什么现在还不安装 Typecho?

因为我们要保持分层排错。

现在先确认:

PHP环境
    ↓
数据库驱动
    ↓
MariaDB

没问题。

否则直接安装 Typecho:

出现:

数据库连接失败

你不知道到底:

  • 用户密码错?
  • 权限错?
  • PHP没驱动?
  • Nginx配置错?

现在一步一步验收。


所以下一步执行:

systemctl restart php-fpm

然后:

systemctl status php-fpm --no-pager

5.3 PHP-FPM通信方式确认

目标:

确定:

Nginx → PHP-FPM

怎么通信。

推荐:

Unix Socket

检查:

grep "^listen" /etc/php-fpm.d/www.conf

截屏2026-08-12 15.13.55

重点第一行listen = /run/php-fpm/www.sock没问题

5.4 创建网站目录结构

不直接使用:

/usr/share/nginx/html

而采用更接近生产环境:

/var/www

创建:

mkdir -p /var/www/blog                ->博客
mkdir -p /var/www/drive                ->网盘

5.5 配置Nginx虚拟主机

目标:

让:

lutiehao.xyz

对应博客目录。

创建:

vim /etc/nginx/conf.d/blog.conf

写:

server {

    listen 80;

    server_name lutiehao.xyz www.lutiehao.xyz;

    root /var/www/blog;

    index index.php index.html;


    location / {

        try_files $uri $uri/ /index.php?$args;

    }


    location ~ \.php$ {

        fastcgi_pass unix:/run/php-fpm/www.sock;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include fastcgi_params;

    }

}

然后检查Nginx配置

nginx -t
systemctl reload nginx 

5.6 测试PHP解析

创建:

vim /var/www/blog/index.php

写:

<?php

phpinfo();

?>

进入浏览器访问http://124.222.7.119

截屏2026-08-12 15.24.01

成功

然后删除测试文件

5.7 下载Typecho

进入博客目录:

cd /var/www/blog

下载

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

解压缩安装包

unzip typecho.zip 

5.8 调整文件权限

让Nginx可以读取:

chown -R nginx:nginx /var/www/blog

检查

ls -ld /var/www/blog

截屏2026-08-12 15.32.26

5.9 浏览器安装Typecho

浏览器访问

http://124.222.7.119

进入安装页面

截屏2026-08-12 15.37.02

重新进入到博客目录

cd /var/www/blog

检查

ls usr

截屏2026-08-12 15.42.05

目录存在

设置权限

chown -R nginx:nginx /var/www/blog/usr/uploads        
chmod -R 755 /var/www/blog/usr/uploads

chown为改变所有者nginx,因为最后写文件的是nginx用户

chmod 755表示权限

7 5 5

所有者:
读 写 执行

其他:
读 执行

检查

ls -ld /var/www/blog/usr/uploads

截屏2026-08-12 15.46.18

PHP-FPM运行用户问题

查看:

ps aux | grep php-fpm

如果看到:

apache php-fpm: pool www

说明PHP-FPM使用apache用户。

修改:

vim /etc/php-fpm.d/www.conf

将:

user = apache
group = apache

修改为:

user = nginx
group = nginx

重启:

systemctl restart php-fpm

验证:

ps aux | grep php-fpm

应该:

nginx php-fpm: pool www

继续安装Typecho

截屏2026-08-12 15.59.21

密码填写创建用户时的密码

然后创建管理员用户,之后便能进入到控制台了

5.10最终验证

检查:

网站

124.222.7.119

打开博客。

数据库

进入:

mariadb

查看:

show databases;

截屏2026-08-12 16.08.21

有typecho正常

标签: none

添加新评论