跳到主要内容

个人技术博客 · Linux 运维 / 自动化 / 可观测性

约 6 分钟阅读

从零在 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
  1. 彻底清理旧环境并更新系统
    因为之前有残留的服务,直接安装会导致严重的包冲突。我首先使用 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 密码时,若提示“无效的密码:密码少于 8 个字符”,是因为 Rocky Linux 默认启用了强密码策略(pwquality),必须设置包含大小写、数字和特殊符号的强密码。向导中建议禁用匿名用户和远程 root 登录,提升安全性。

  1. 为 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 联动配置(核心难点)

  1. 安装 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 连不上数据库。

  2. 下载并部署 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/
  1. 解决 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

  1. 安装策略管理工具
    sudo dnf install policycoreutils-python-utils -y
  2. 添加永久允许读取的规则
    “`
    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 架构容器化重构,向云原生迈出下一步。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注