从零在 Rocky Linux 手搓 LNMP 架构并部署 WordPress 实战
前言#
在之前的项目中,我使用了宝塔面板来快速部署个人云服务器上的博客。但作为未来的运维工程师,我深知“图形化界面能让人走得更快,但命令行能让人走得更远”。
为了彻底弄懂 LNMP(Linux + Nginx + MySQL + PHP)的底层通信逻辑,我决定清空本地 VMware 里的旧环境,在纯命令行的 Rocky Linux 9.7 上,从零手动部署一套 WordPress。
本文记录了完整的部署流程,以及实战中踩到的致命坑点(特别是 SELinux 的安全上下文拦截)。
一、 环境准备与基础配置#
- 操作系统:Rocky Linux 9.7 (Blue Onyx) x86_64
- 虚拟机:VMware Workstation (NAT 模式)
- 部署架构:Nginx (处理静态与转发) + MariaDB (数据库) + PHP-FPM (解析 PHP) + WordPress
1. 确认系统信息#
作为一个运维习惯,拿到系统第一步是确认发行版和架构,避免用错包管理器(如 Ubuntu 的 apt与 Rocky 的 dnf)。
cat /etc/os-release
hostnamectl
uname -r
2. 彻底清理旧环境并更新系统#
因为之前有残留的服务,直接安装会导致严重的包冲突。我首先使用 dnf remove 强制卸载了旧的 MariaDB 和 MySQL 残留文件,并更新了全系统软件包:
sudo dnf update -y
二、 部署 Nginx 服务与网络放行#
1. 安装与启动#
sudo dnf install nginx -y
sudo systemctl enable --now nginx
2. 配置防火墙 (Rocky 专属)#
Rocky 默认使用 firewalld。如果只启动 Nginx 而不放行防火墙,外网是绝对访问不到的。
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
此时在宿主机浏览器访问虚拟机 IP,能看到绿色的 "Welcome to nginx!" 默认页,证明 Web 服务层已通。
三、 部署数据库 MariaDB#
1. 安装与安全初始化#
sudo dnf install mariadb-server -y
sudo systemctl enable --now mariadb
sudo mysql_secure_installation
(在安全向导中,我设置了 root 密码,禁用了匿名用户和远程 root 登录,提升了数据库的安全性。)
2. 为 WordPress 建库建号#
进入数据库,创建专属的库和用户:
CREATE DATABASE wp_blog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY '你的强密码';
GRANT ALL PRIVILEGES ON wp_blog.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
四、 部署 PHP 与 Nginx 联动配置(核心难点)#
1. 安装 PHP-FPM 及扩展#
sudo dnf install php php-fpm php-mysqlnd php-gd php-xml php-mbstring -y
sudo systemctl enable --now php-fpm
(注:在 Rocky 9 的默认配置中,PHP-FPM 使用 Unix Socket 与 Nginx 通信,而不是监听 TCP 9000 端口,这更高效安全。)
2. 解决 Nginx 默认站点冲突#
将 WordPress 源码放入 /usr/share/nginx/html/ 后,发现访问 IP 依然是 Nginx 默认页。这是因为主配置文件 /etc/nginx/nginx.conf 中自带了一个 default_server 拦截了请求。
处理方案:删掉主配置文件中的默认 server { ... } 块,并在 /etc/nginx/conf.d/wordpress.conf 中编写专属配置:
server {
listen 80;
server_name 192.168.244.241;
root /usr/share/nginx/html;
index index.php index.html;
location / {
try_files
u
r
i
uriuri/ /index.php?$args;
}
location ~ .phpuri =404;
fastcgi_pass unix:/run/php-fpm/www.sock; # 与 PHP-FPM 通信的关键
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
d
o
c
u
m
e
n
t
r
o
o
t
document
r
ootfastcgi_script_name;
include fastcgi_params;
}
}
text
配置完成后执行 sudo nginx -t 检查语法,并重启 Nginx。
五、 终极排障:SELinux 引发的 403 惨案#
将 WordPress 源码放入站点目录,并修改了属主(chown -R nginx:nginx)后,刷新网页,还是报了 403 Forbidden。Nginx 错误日志显示 Permission denied。
原因分析:Rocky Linux 默认开启了 SELinux 安全子系统。即使文件权限是 755,只要安全上下文标签不对,Nginx 依然无法读取文件。
踩坑记录:一开始尝试用 chcon 命令临时修改标签,结果系统直接报错 无效的参数,说明系统安全策略拒绝了该操作。
终极解决方案:使用 semanage 结合 restorecon 进行永久性策略配置。
-
安装策略管理工具
sudo dnf install policycoreutils-python-utils -y -
添加永久允许读取的规则
sudo semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html(/.*)?" -
给 wp-content 目录单独添加允许写入的规则(保证后续能传图片、装插件)
bashsudo semanage fcontext -a -t httpd_sys_rw_content_t "/usr/share/nginx/html/wp-content(/.*)?" -
重新应用上下文规则(让新标签生效)
sudo restorecon -Rv /usr/share/nginx/html/执行完这套连招后,刷新网页,那个熟悉的 WordPress 安装界面终于出现了。填入之前建好的数据库信息,完成了建站。
六、 总结与复盘#
这次从零手搓 LNMP,最大的收获不是记住了几条安装命令,而是深刻理解了 Linux 的服务机制与底层安全。
- 包管理与服务管理:明白了
dnf和systemctl的强大,以及enable --now这样高效的操作。 - Nginx 反向代理机制:搞懂了 Nginx 遇到
.php文件时,是如何通过 Socket 把它甩给 PHP-FPM 处理的。 - SELinux 的威力:以前遇到权限问题只知道
chmod 777,现在懂得了从安全上下文的维度去定位并解决问题,这是 Ubuntu 系统里体会不到的。
接下来,我计划在这套环境的基础上,利用 Docker 将 LNMP 架构容器化重构,向云原生迈出下一步。
(本博客的云端环境同样采用了类似的 LNMP 架构,并已完成全站 HTTPS 加密与安全加固。欢迎交流!)
发表回复