一、为什么两台 Web 节点要尽量保持一致

在负载均衡架构里,web01web02 都可能接收到用户请求。
因此原笔记在部署时采用的思路非常明确:

  • 两台 Web 的运行用户统一
  • PHP 环境统一
  • Nginx 配置统一
  • 代码结构统一
  • 上传目录挂载同一份 NFS 共享

如果这几项不一致,就很容易出现:

  • 某一台机器能访问,另一台不能
  • 上传文件只在单节点存在
  • 代码版本不同步

二、web01 先做完整主节点部署

原笔记先在 web01 上完成完整部署,再把结果同步到 web02

2.1 创建统一站点用户

useradd -u 1999 -s /sbin/nologin -M www
id www

这里的重点是后续:

  • PHP-FPM 用 www
  • Nginx 用 www
  • 站点目录属主也用 www

这样权限管理会简单很多。

2.2 安装并配置 PHP-FPM

原笔记使用 Webtatic 的 PHP 7.2 仓库,然后安装了一整套 PHP 运行依赖,包括:

  • php72w-fpm
  • php72w-mysqlnd
  • php72w-gd
  • php72w-mbstring
  • php72w-opcache
  • php72w-pecl-redis

安装完成后启动:

systemctl enable php-fpm
systemctl start php-fpm

接着修改 /etc/php-fpm.d/www.conf

user = www
group = www

然后重启:

systemctl restart php-fpm

这一步确保 PHP 处理进程与站点目录权限一致。

2.3 安装并配置 Nginx

原笔记同样在 web01 上安装 Nginx,并把 /etc/nginx/nginx.conf 中的运行用户改为:

user www;

随后创建动态站点配置:

server {
  listen 80;
  server_name blog.oldboylinux.cn;
  root /app/code/blog;

  error_log /var/log/nginx/blog-error.log notice;
  access_log /var/log/nginx/blog-access.log main;

  location / {
    index index.php;
  }

  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_buffering on;
    fastcgi_buffers 64 64k;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

这个配置的核心是:

  • 默认首页改成 index.php
  • .php 请求通过 FastCGI 转给 127.0.0.1:9000

之后执行:

nginx -t
systemctl restart nginx php-fpm
mkdir -p /app/code/blog/

三、在 web01 上先完成 WordPress 代码落地

原笔记先把 WordPress 代码解压到:

/app/code/blog/

示例:

unzip WordPress-master.zip
mv WordPress-master/* /app/code/blog/
chown -R www.www /app/code/blog/

然后通过本地 hosts 把:

192.168.1.20 blog.oldboylinux.cn

指向 web01,在浏览器里先完成首次安装向导,包括:

  • 进入 Let's go
  • 填写数据库信息
  • 运行安装
  • 创建后台管理员账号

这个顺序很合理,因为先在单节点把应用本身装通,再做第二台节点同步,会更容易排错。

四、为什么上传目录要单独挂 NFS

原笔记把 WordPress 的上传目录单独拿出来处理:

mkdir -p /app/code/blog/wp-content/uploads
yum install nfs-utils -y
mount -t nfs 172.16.1.24:/nfs/wordpress /app/code/blog/wp-content/uploads/

验证:

df -h | grep wp

然后在 web01 上创建测试文件,再去 NFS 主机上检查。
如果文件能在 NFS 服务端看到,就说明挂载成功。

这个设计的意义非常直接:

  • WordPress 程序代码可以复制
  • 但用户上传内容必须共享

否则用户从某个节点上传的图片,切换到另一节点访问时就可能找不到。

五、web02 如何快速和 web01 保持一致

原笔记在 web02 上沿用了与 web01 基本相同的做法:

  • 创建 www 用户
  • 安装并配置 PHP-FPM
  • 把 PHP-FPM 的运行用户改成 www
  • 安装 Nginx,并把 Nginx 用户改成 www

不同之处主要是:

5.1 直接复用 web01 的配置文件

web01 把站点配置同步到 web02

scp blog.oldboylinux.cn.conf 192.168.1.22:`pwd`

5.2 直接复用 web01 的 WordPress 代码

原笔记在 web01 上打包代码,但排除了上传目录内容:

tar zcf ~/wordpress-no-uploads.tar.gz . --exclude=/app/code/blog/wp-content/uploads/*
scp ~/wordpress-no-uploads.tar.gz 192.168.1.22:~

然后在 web02 解压:

tar xf wordpress-no-uploads.tar.gz -C /app/code/blog/

这里排除上传目录是合理的,因为上传内容本来就会通过 NFS 共享。

5.3 在 web02 上同样挂载 NFS

yum install nfs-utils -y
mount -t nfs 172.16.1.24:/nfs/wordpress /app/code/blog/wp-content/uploads/

验证方法和 web01 一样:
web02 上创建测试文件,再去 NFS 主机上确认是否写入成功。

六、这套部署方式为什么适合做 WordPress 集群

原笔记虽然是分步演示,但背后的架构思路其实很完整:

  • 程序代码在两台 Web 上保持一致
  • 上传目录统一挂到同一个 NFS
  • 数据库统一使用远端 MariaDB
  • Web 处理进程统一使用 www

这样后面再接入负载均衡时,两台节点对用户来说就更接近“同一套站点的两个入口”。

七、小结

双 Web 节点部署 WordPress 的关键,不是简单把代码复制两份,而是先统一运行环境,再把“可复制内容”和“必须共享内容”区分开:

  • PHP-FPM 与 Nginx 统一到 www
  • 代码通过打包或同步复制
  • 上传目录通过 NFS 共享

只要把这三层关系理顺,后面的负载均衡接入就会顺畅很多。