Rocky Linux 部署 LNMP 与 Typecho 个人博客实战
我的个人博客
其架构
互联网
│
▼
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.sockRocky官方文档本身就是把这个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=?
② 看内核
uname -r
③ 看服务器资源
free -h这是看内存。
然后:
df -hT /这是看根文件系统磁盘空间。

④ 检查 SELinux
getenforce
这次不为了省事执行setenforce 0。
所以需要永久修改配置文件/etc/selinux/config。

顺便补充临时修改
# 临时切换为宽容模式
setenforce 0
# 临时切换为强制模式
setenforce 1⑤ 看 Nginx 是否还存在
rpm -q nginx
⑥ 检查 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
为什么要修改权限为仅root用户读写?
Swap里可能包含曾经位于内存里的数据,所以不能让普通用户随意读取
格式化成 Swap
mkswap /swapfile这里其实和格式化磁盘有点像:
普通文件
/swapfile
↓
mkswap
↓
Linux可以识别的Swap区域然后启用:
swapon /swapfile验证:
swapon --show再
free -h
可以看到从Swap:0B变到Swap:2.0Gi
1.3 让 Swap 重启后依然存在
永久修改配置文件
vim /etc/fstab在最后添加:
/swapfile swap swap defaults 0 0
重要知识
/etc/fstab是Linux用来描述:
系统启动时应该自动挂载哪些文件系统/交换空间
的配置文件。
错误修改可能导致机器启动异常
所以修改后验证
mount -a没有报错即没有问题
1.4 检查系统时间
执行:
timedatectl主要看Time zone

确认为Asia/Shanghai(CST,+0800)即正常
如果不是可以设置
timedatectl set-timezone Asia/Shanghai再
timedatectl服务器时间重要,因为后期查看大量日志,如果时区不对,排障会很难对上
1.5 检查软件源
执行:
dnf repolist我们需要确认 Rocky 的软件源正常。
然后:
dnf makecache它的意思不是安装软件,而是:
把软件仓库的元数据信息缓存下来。

1.6 检查网络和防火墙,但先不修改
执行:
ip addr
这里有一个很值得学习的现象:
我的腾讯公网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
目前为关闭状态,先不管
此阶段小总结
服务器配置
Rocky Linux 9.4
2C2G
50GB
SELinux EnforcingSwap
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 -ydnf install nginx:通过 Rocky Linux 的软件仓库安装 Nginx,并由 RPM 包管理器记录软件文件、依赖和版本信息。Rocky官方的DNF文档就是把DNF作为系统的软件包管理方式;Nginx也可以通过软件包方式安装。
确认
rpm -q nginx
2.2 看看 Nginx 被安装到了哪里
执行
nginx -V
再执行:
rpm -ql nginx | less这个命令的意思:
rpm
|
|-q query 查询
|
`-l list files 列出文件也就是:
“这个 nginx RPM 包到底往系统里安装了哪些东西?”
以后想知道软件安装到哪了,可以先想到:
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
现在目录是空的。
创建第一个真正属于你的网站页面:
vim /var/www/blog/index.html随便写点
保存并确认:
cat /var/www/blog/index.html
2.5 现在启动 Nginx
执行:
systemctl enable --now nginx这里同时做了两件事:
启动Nginx服务
设置开机自动启动检查
systemctl status nginx --no-pager
2.6 不急着打开浏览器,先看它到底监听没监听
执行:
ss -lntp | grep nginx可以看到

这里
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 响应头。

由此结果,已经可以证明
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.htmlNginx 就会去找:
/var/www/blog/index.html这也是上次你遇到 File not found 时一直在排查的核心概念:
URL路径
+
root
=
服务器上的实际文件index
index index.html;意思:
访问:
http://124.222.7.119/而没有指定文件时,优先找:
index.htmltry_files
try_files $uri $uri/ =404;现阶段理解成:
优先寻找用户请求的真实文件或目录,找不到就返回 404。
以后 Typecho 阶段我们会把这里改成支持 Typecho 路由的写法。
现在不提前改。
2.9 每次改 Nginx 配置后,都养成这个习惯
千万别写完就直接 reload。
先:
nginx -t我们希望看到这个结果

nginx -t 就是:
先测试配置,不真正应用。
测试成功后
systemctl reload nginx2.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 那个虚拟主机。成功后,可以直接看到

这一刻意味着
curl
↓
Nginx
↓
匹配 blog.conf
↓
root /var/www/blog
↓
index.html已经全部正常。
2.11 最后才从公网访问
先确认腾讯云轻量服务器防火墙仍然有:
TCP
80
全部 IPv4
允许
然后浏览器访问
http://124.222.7.119成功的话可以看到

此阶段小结
需要能够回答
为什么输入一个 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,命令行模式。

也就是说现在已经可以:
php xxx.php在命令行执行 PHP,但 Nginx 还不能执行它。
3.3 认识 PHP-FPM 的配置,但现在不修改
先执行:
grep -E '^(user|group|listen|listen\.acl_users)' /etc/php-fpm.d/www.conf
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
3.5 验证 socket 真的存在
这一步非常重要。
执行:
ls -l /run/php-fpm/www.sock
最前面的s表示socket文件
-rw-r--r-- 普通文件
d 目录
l 软链接
s socket再执行
ss -lx | grep php-x 表示查看 Unix socket。

应该能看到 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-FPM3.8 先测试 Nginx 配置
还是我们的固定动作:
nginx -t必须看到:
syntax is ok
test is successful然后:
systemctl reload nginx
这条以后形成肌肉记忆:
修改
↓
nginx -t
↓
成功
↓
reload3.9 创建一个最简单的 PHP 测试文件
这次不用 phpinfo()。
因为 phpinfo() 会把服务器 PHP 配置、模块、路径等大量信息暴露出来,不适合公网服务器长期存在;Rocky 官方也特别提醒测试完要删除这类页面。
我们创建:
vim /var/www/blog/test.php只写:
<?php
echo "PHP is working!";
?>保存。
查看:
cat /var/www/blog/test.php
3.10 先不用浏览器,服务器内部测试
执行:
curl -H 'Host: 124.222.7.119' http://127.0.0.1/test.php
这里发生了什么?
Nginx
↓
识别 .php
↓
PHP-FPM
↓
执行 PHP
↓
echo
↓
Nginx返回结果LNMP里的P层已经打通
3.11 再从 Mac 浏览器测试
访问:
http://124.222.7.119/test.php可以看到

3.12 再检查日志
即使成功,也建议看一次:
tail -20 /var/log/nginx/access.log可以看到

再
tail -20 /var/log/nginx/error.log正常没有新错误
PHP-FPM 日志:
journalctl -u php-fpm -n 20 --no-pager
这一步是培养一个非常重要的习惯:
服务正常也要知道日志在哪。
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
mariadb
→ MariaDB 客户端命令
mariadb-server
→ 真正运行数据库服务的服务端软件4.3启动数据库
执行:
systemctl enable --now mariadb检查:
systemctl status mariadb --no-pager
4.4 看看数据库监听在哪里
执行:
ss -lntp | grep 3306MariaDB 默认 TCP 端口是:
3306
这里的*为通配符,*: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
然后重启MariaDB
systemctl restart mariadb确认服务没挂:
systemctl status mariadb --no-pager
再查:
ss -lntp | grep 3306
已经变为127.0.0.1:3306
此时只会监听本机回环接口
外部主机无法直接连接
腾讯云防火墙也不要添加 3306 入站规则。
这就是一个非常重要的安全原则:
需要公网访问:
80 HTTP
443 HTTPS
22 SSH
不需要公网访问:
3306 MariaDB4.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)]>
这里MariaDB [(none)]>是
MariaDB SQL 命令行
从这一刻开始敲的不是Linux命令,而是 SQL。
输入
show databases;可以看到系统自带数据库

4.7 创建属于 Typecho 的数据库
现在在:
MariaDB [(none)]>里面执行:
CREATE DATABASE typecho
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;这里解释一下。
数据库名字:
typecho字符集:
utf8mb4utf8mb4 可以完整保存 Unicode 字符,包括中文以及 Emoji 等字符。
检查:
SHOW DATABASES;
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';
验证创建的用户和密码是否正确,直接用密码登陆。
先从当前 MariaDB 管理会话退出:
EXIT;然后在 Linux Shell 里执行:
mariadb -u typecho -p出现:
Enter password:输入设置的密码

成功登陆
然后再执行:
SELECT CURRENT_USER(), USER();
这里有两个概念
USER()
→ 你是以什么身份发起连接的
CURRENT_USER()
→ MariaDB 最终用哪个账户完成权限认证接下来检查它是不是能访问博客数据库:
先退出到root,重新用maraidb登陆为数据库管理员,然后
USE typecho;应该:
Database changed然后:
SHOW TABLES;现在还没装 Typecho,所以正常应该是:
Empty set最后检查权限:
SHOW GRANTS FOR CURRENT_USER;
这就同时验证了四件事:
账户:typecho@localhost ✅
密码:第二次设置的密码 ✅
数据库:typecho ✅
权限:只管理 typecho.* ✅还可以顺手验证一下“最小权限原则”。回到 typecho 用户登录状态,执行:
CREATE DATABASE test123;应该报类似:
ERROR 1044/1045 ... Access denied这反而是正确结果,因为我们不希望博客账户拥有创建其他数据库的权限。

然后:
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这也是安全设计。

4.10 刷新权限
执行:
FLUSH PRIVILEGES;作用:
让 MariaDB 重新加载权限表。
虽然 MariaDB 新版本很多授权操作会自动生效,但习惯上生产环境仍保留这个步骤。

4.11 用普通用户测试登陆
以用户身份登陆MariaDB
mariadb -u typecho -p然后:
USE typecho;成功:
Database changed
说明:用户➡️密码➡️权限➡️数据库 全部正常
4.12 安全检查
检查 MariaDB 监听地址
执行:
ss -lntp | grep 3306
只允许监听本机
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 -y5.2 重启 PHP-FPM
现在执行:
systemctl restart php-fpm为什么需要?
因为:
安装扩展只是:
磁盘上出现模块文件但是:
正在运行的 PHP-FPM还是旧进程。
所以需要重新加载:
旧PHP-FPM
↓
停止
↓
启动
↓
加载新扩展
5.3 查看 PHP 模块
接着执行:
php -m | grep -E "mysqli|pdo_mysql|curl|mbstring"
正常
解释一下:
curl
PHP访问网络:
例如:
PHP
|
|
外部APImbstring
中文支持:
博客一定需要。
例如:
文章:
你好,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-pager5.3 PHP-FPM通信方式确认
目标:
确定:
Nginx → PHP-FPM
怎么通信。
推荐:
Unix Socket检查:
grep "^listen" /etc/php-fpm.d/www.conf
重点第一行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

成功
然后删除测试文件
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
5.9 浏览器安装Typecho
浏览器访问
http://124.222.7.119进入安装页面

重新进入到博客目录
cd /var/www/blog检查
ls usr
目录存在
设置权限
chown -R nginx:nginx /var/www/blog/usr/uploads
chmod -R 755 /var/www/blog/usr/uploadschown为改变所有者nginx,因为最后写文件的是nginx用户
chmod 755表示权限
7 5 5
所有者:
读 写 执行
其他:
读 执行检查
ls -ld /var/www/blog/usr/uploads
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

密码填写创建用户时的密码
然后创建管理员用户,之后便能进入到控制台了
5.10最终验证
检查:
网站
124.222.7.119打开博客。
数据库
进入:
mariadb查看:
show databases;
有typecho正常
