从零在 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
- 彻底清理旧环境并更新系统
因为之前有残留的服务,直接安装会导致严重的包冲突。我首先使用dnf remove强制卸载了旧的MariaDB和MySQL残留文件,并更新了全系统软件包:
sudo dnf update -y
二、 部署 Nginx 服务与网络放行
- 安装与启动
sudo dnf install nginx -y sudo systemctl enable --now nginx - 配置防火墙 (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
- 安装与安全初始化
sudo dnf install mariadb-server -y sudo systemctl enable --now mariadb sudo mysql_secure_installation🚨 踩坑记录
在安全向导中设置 root 密码时,若提示“无效的密码:密码少于 8 个字符”,是因为 Rocky Linux 默认启用了强密码策略(pwquality),必须设置包含大小写、数字和特殊符号的强密码。向导中建议禁用匿名用户和远程 root 登录,提升安全性。
- 为 WordPress 建库建号
进入数据库,创建专属的库和用户:
sudo mysql -u root -p
CREATE DATABASE wp_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'Your_Strong_Password';
GRANT ALL PRIVILEGES ON wp_db.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
解释:utf8mb4 是支持 Emoji 表情的最全字符集;localhost 限制该用户只能从本机登录,防止外部直连数据库。
四、 部署 PHP 与 Nginx 联动配置(核心难点)
-
安装 PHP-FPM 及扩展
sudo dnf install php php-fpm php-mysqlnd php-gd php-xml php-mbstring -y sudo systemctl enable --now php-fpm解释:php-fpm 是 FastCGI 进程管理器;php-mysqlnd 是 PHP 连接 MySQL 的驱动,必须安装,否则 WordPress 连不上数据库。
-
下载并部署 WordPress 源码
进入临时目录cd /tmp
下载官方中文版源码 (如果没有 wget,先执行 sudo dnf install wget -y)
sudo wget https://cn.wordpress.org/latest-zh_CN.tar.gz
解压
sudo tar -xzvf latest-zh_CN.tar.gz
复制到 Nginx 的网站根目录
sudo cp -r wordpress/* /usr/share/nginx/html/
赋予 Nginx 用户读取权限
sudo chown -R nginx:nginx /usr/share/nginx/html/
- 解决 Nginx 默认站点冲突
将源码放入目录后,访问 IP 依然是 Nginx 默认页。因为主配置 `/etc/nginx/nginx.conf `中自带了一个 `default_server` 拦截了请求。
第一步:干掉主配置中的默认块
sudo vi /etc/nginx/nginx.conf
找到 `server { … } `块,将这一大块完整删除。
🚨 致命踩坑
千万不要误删主配置中的 `include /etc/nginx/conf.d/*.conf`;,否则` Nginx` 将不会加载我们自定义的站点配置,导致 `80 `端口不监听!
第二步:编写专属配置
sudo vi /etc/nginx/conf.d/wordpress.conf
粘贴以下标准配置(注意替换你的 IP):
server {
listen 80;
server_name 192.168.244.128; # 替换为你的虚拟机IP
root /usr/share/nginx/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock; # Rocky 9 使用 Socket 通信
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
第三步:测试并重启
sudo nginx -t
sudo systemctl restart nginx
五、 终极排障:`SELinux `引发的` 403 `惨案
重启 `Nginx `后,刷新网页,网页报` 403` `Forbidden`。查看错误日志:
sudo tail -n 20 /var/log/nginx/error.log
提示 Permission denied
原因分析
`Rocky Linux` 默认开启了 `SELinux` 安全子系统。即使文件权限是 `755`,只要安全上下文标签不对,`Nginx` 依然无法读取文件。
踩坑记录
尝试用 `chcon` 命令临时修改标签,系统直接报错“无效的参数”,说明系统安全策略拒绝了临时修改。
终极解决方案:使用 `semanage` 结合 `restorecon `进行永久性策略配置。
bash
- 安装策略管理工具
sudo dnf install policycoreutils-python-utils -y - 添加永久允许读取的规则
“`
sudo semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html(/.*)?"
<pre></pre></li>
<li>给 wp-content 目录单独添加允许写入的规则(保证后续能传图片、装插件)
<pre>sudo semanage fcontext -a -t httpd_sys_rw_content_t "/usr/share/nginx/html/wp-content(/.*)?"</pre></li>
<li>重新应用上下文规则(让新标签生效)
“`
sudo restorecon -Rv /usr/share/nginx/html/执行完这套连招后,刷新网页,WordPress 安装界面终于出现了。填入第三步建好的数据库信息,完成了建站。
六、 总结与复盘
这次从零手搓 LNMP,最大的收获不是记住了几条安装命令,而是深刻理解了 Linux 的服务机制与底层安全:
包管理与服务管理:明白了 dnf 和 systemctl 的强大,以及 enable --now 这样高效的操作。
Nginx 联动机制:搞懂了 Nginx 遇到 .php 文件时,是如何通过 Unix Socket 把它甩给 PHP-FPM 处理的。
SELinux 的威力:以前遇到权限问题只知道 chmod 777,现在懂得了从安全上下文的维度去定位并解决问题,这是 Ubuntu 系统里体会不到的。
接下来,我计划在这套环境的基础上,利用 Docker 将 LNMP 架构容器化重构,向云原生迈出下一步。
发表回复