两台服务器主机都需要安装nfs-utils

挂载之后的目录权限问题:

这种场景是典型的 多 Web 节点共享存储架构。实现思路是将 NFS 服务器作为中心存储,web01 和 web02(客户端)都挂载 NFS 的同一个目录。

这样无论用户请求落到哪台机器,上传的图片都会直接写入 NFS 服务器,两台机器读取到的也是同一份数据。

1. 架构规划(假设)

  • NFS 服务端:192.168.10.120(存储服务器)

  • Web 客户端:

    • web01:192.168.10.100

    • web02:192.168.10.110

  • 共享数据目录:假设网站图片上传目录为 /code/wordpress/wp-content/uploads

2. NFS 服务端操作(NFS Server)

第一步:创建统一运行用户

为了保证权限一致(避免两台 Web 上的 www 或 nginx 用户 UID/GID 不一致导致无法读写),在 NFS 服务端创建专门的映射用户:

Bash

groupadd -g 666 www
useradd -u 666 -g 666 -M -s /sbin/nologin www

第二步:创建共享目录并赋权

Bash

mkdir -p /data/uploads
chown -R www:www /data/uploads

第三步:编辑共享配置文件 /etc/exports

Bash

vim /etc/exports

写入配置(允许 web01 和 web02 所在网段挂载,并将所有访问用户强制映射为 UID 666 的 www 用户):

Plaintext

/data/uploads 192.168.10.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

第四步:启动服务并生效

Bash

systemctl enable --now nfs-server
exportfs -rv

3. Web 节点操作(web01 和 web02 都要做)

第一步:保证 Web 服务的执行用户 UID/GID 为 666

检查或创建 php-fpm / nginx 运行的用户(通常为 www),确保其 UID 和 GID 也是 666:

Bash

# 查看当前 www 用户的 uid
id www
# 若不存在或不一致,建议统一统一为 666
useradd -u 666 -g 666 -M -s /sbin/nologin www

同时确保 nginx.conf 和 php-fpm 进程池配置(www.conf)里的运行用户都是 user = www, group = www。

第二步:迁移存量数据(重要)

如果本地上传目录已有图片,先备份并同步到 NFS:

Bash

# 将现有的图片拷贝到 NFS(可以临时 mount 后拷贝,或者用 rsync)
rsync -avz /code/wordpress/wp-content/uploads/ 192.168.120:/data/uploads/

第三步:客户端挂载(开机自启)

直接写入 /etc/fstab(Web 站点的静态资源目录需要长期在线,推荐用 fstab 永久挂载,无需用 autofs):

Bash

vim /etc/fstab

末尾追加:

Plaintext

192.168.10.120:/data/uploads /code/wordpress/wp-content/uploads nfs defaults,_netdev 0 0

注:_netdev 参数表示网络就绪后再挂载,防止开机卡死。

第四步:测试挂载

Bash

mount -a
df -Th
#查看挂载情况