集群多台 Web 同步文件太麻烦?NFS 简单搞定统一存储
Linux NFS 网络文件服务
一、NFS 基础概念介绍
1.1 什么是 NFS
NFS(Network File System,网络文件系统)是经典跨主机文件共享技术,能让客户端像访问本地磁盘一样透明读写远程服务器共享目录,广泛用于 Linux 集群统一存储、企业内部文件共享场景。
1.2 NFS 版本迭代
- NFSv3:使用最广泛,无状态协议,支持大文件,兼容 UDP/TCP 传输,性能稳定;
- NFSv4:新增 Kerberos 安全认证、状态化连接、完善文件锁,安全性大幅提升。
1.3 核心架构(C/S 架构)
- NFS 服务端:存放原始文件,运行 nfs-server、rpc 相关进程,通过配置文件导出共享目录,管控客户端访问权限;
- NFS 客户端:通过
mount将远程共享挂载到本地目录,操作逻辑和本地文件完全一致。
1.4 工作原理(RPC 远程调用机制)
NFS 不固定端口,依赖 RPC(portmap)做端口协调,完整流程:
- 注册:服务端 NFS 启动,向 portmap 注册自身监听端口;
- 端口查询:客户端先访问服务端 portmap,获取 NFS 服务端口;
- 挂载鉴权:客户端发起挂载请求,服务端校验客户端IP/域名权限;
- 读写转发:挂载完成后,所有文件读写操作通过 RPC 转发给服务端执行,结果回传给客户端;
- 权限校验:依靠 Linux UID/GID 用户组机制控制文件读写权限。
1.5 传输与协议特性
- 无状态(NFSv3):服务端不保存客户端连接状态,断网重连无需恢复会话,容错简单;
- 双传输协议
- UDP:低开销,适合局域网实时小文件;
- TCP:面向连接可靠传输,大数据、公网环境首选。
1.6 NFS 优缺点
优势
- 访问透明:远程文件和本地操作无感知;
- 跨平台:支持 Linux、UNIX、macOS;
- 性能高效:自带缓存机制,局域网读写速度优秀;
- 配置简单:仅需修改 exports 配置文件即可完成共享发布。
局限性
- 早期版本安全弱:NFSv3 无加密,仅靠IP鉴权,易被伪造;NFSv4 安全增强,高安全场景仍需搭配防火墙/VPN;
- 强依赖网络:延迟、丢包会直接降低读写速度;
- 多客户端文件锁逻辑复杂,并发写入不当易出现数据不一致。
1.7 典型应用场景
- 企业内网办公文件、软件包统一共享;
- Web/数据库集群统一后端存储(本篇实战场景);
- 路由器、NAS 嵌入式设备简易文件互通。
二、实验环境规划
使用 CentOS7 系统,克隆3台虚拟机,规划如下:
| 节点名称 | IP地址 | 角色 |
|---|---|---|
| nfs-server | 10.1.8.20/24 | NFS共享存储服务端 |
| nfs-client1 | 10.1.8.21/24 | Web客户端节点1 |
| nfs-client2 | 10.1.8.22/24 | Web客户端节点2 |
网关、DNS统一:10.1.8.2
三、三台主机基础网络与主机名配置
3.1 nfs-server 配置
# 修改主机名hostnamectl set-hostname nfs-server# 静态IP配置nmcli connection modify ens33 ipv4.method manual ipv4.address10.1.8.20/24 ipv4.gateway10.1.8.2 ipv4.dns10.1.8.2 autoconnectyes# 重启网卡生效nmcli connection up ens333.2 nfs-client1 配置
hostnamectl set-hostname nfs-client1 nmcli connection modify ens33 ipv4.method manual ipv4.address10.1.8.21/24 ipv4.gateway10.1.8.2 ipv4.dns10.1.8.2 autoconnectyesnmcli connection up ens333.3 nfs-client2 配置
hostnamectl set-hostname nfs-client2 nmcli connection modify ens33 ipv4.method manual ipv4.address10.1.8.22/24 ipv4.gateway10.1.8.2 ipv4.dns10.1.8.2 autoconnectyesnmcli connection up ens33四、NFS 服务端完整部署(10.1.8.20)
4.1 安装依赖包
NFS 核心工具:nfs-utils,本次实验同步安装 Apache 用于Web测试
yuminstall-ynfs-utils httpd4.2 创建共享目录并配置属主
Web服务运行用户为 apache,目录归属 apache 用户,避免权限报错
mkdir-p/shares/webappchownapache /shares/webapp/4.3 开机自启并立即启动 NFS 服务
systemctlenablenfs-server--now4.4 防火墙放行 NFS 相关服务
临时放行 + 永久写入防火墙规则
# 临时生效firewall-cmd --add-service=nfs --add-service=rpc-bind --add-service=mountd# 永久保存firewall-cmd --add-service=nfs --add-service=rpc-bind --add-service=mountd--permanent4.5 NFS 共享导出配置详解
核心配置文件
- 主配置:
/etc/exports - 扩展配置目录:
/etc/exports.d/,目录下以.exports结尾的文件自动加载,推荐使用该目录拆分配置,避免改坏全局配置。
配置语法说明
共享目录 客户端匹配规则(权限参数)客户端匹配支持格式:
- 主机域名:
nfs-client1.chenxin.cloud - 域名通配:
*.chenxin.cloud(chenxin 域下所有主机) - 单IP:
10.1.8.21 - 网段:
10.1.8.0/24/10.1.8.0/255.255.255.0 - IPv6地址/网段:
fde2:6494:1e09:2::20、fde2:6494:1e09:2::/64
多客户端空格分隔:
/shares/webapp10.1.8.0/24 client.chenxin.cloud *.example.net常用权限参数
rw:读写权限;默认ro只读;no_root_squash:关闭root压制。默认客户端root访问会被转换成nobody用户,开启后保留真实root权限;sync:同步写入,数据落盘后再返回结果,保证数据安全(默认开启)。
实战配置:允许10.1.8.0/24网段读写共享
编辑主配置文件
vim/etc/exports写入内容:
/shares/webapp10.1.8.0/24(rw)4.6 重载共享配置生效
修改 exports 后必须重载,三种方式任选其一:
# 重载导出配置(推荐)exportfs-r# 重载nfs服务systemctl reload nfs-server# 查看并同步所有导出规则exportfs-av4.7 查看当前已发布的共享目录
# 简洁查看exportfs# 完整查看包含权限参数exportfs-v输出示例:
/shares/webapp10.1.8.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)五、客户端挂载与权限测试(nfs-client1)
5.1 客户端安装工具包
yuminstall-ynfs-utils httpd# 查看apache用户ID(所有节点apache uid=48,保证跨机权限统一)idapache# 启动httpd并开机自启systemctlenablehttpd--now# 实验环境直接关闭防火墙简化操作systemctl stop firewalld5.2 查看服务端发布的共享列表
showmount-e10.1.8.20返回结果:
Export listfor10.1.8.20: /shares/webapp10.1.8.0/245.3 手动挂载NFS共享
将服务端/shares/webapp挂载到本地网站根目录/var/www/html
mount-tnfs10.1.8.20:/shares/webapp /var/www/html5.4 验证挂载状态
df-h|grepwww输出:
10.1.8.20:/shares/webapp 50G4.4G 46G9% /var/www/html5.5 默认root_squash权限测试
默认配置开启root压制,客户端root无法创建文件:
touch/var/www/html/root-f1# 报错:Permission denied切换apache用户可正常写入:
su-l-s/bin/bash apacheechoapache website>/var/www/html/web1.html
浏览器访问http://10.1.8.21/web1.html,页面输出apache website,Web服务读取NFS共享文件成功。
5.6 修改服务端配置关闭root压制
1. 修改exports配置
vim/etc/exports更新配置行:
/shares/webapp10.1.8.0/24(rw,no_root_squash)2. 重载配置并验证参数
exportfs-rexportfs-v参数中可见no_root_squash代表关闭root压制。
3. 重新测试root写入
客户端root可正常创建文件:
touch/var/www/html/root-f1ls/var/www/html# 输出 root-f1 web1.html六、第二台客户端 nfs-client2 同步挂载测试
6.1 客户端基础环境部署
yuminstall-ynfs-utils httpdidapache systemctlenablehttpd--nowsystemctl stop firewalld6.2 查看共享并挂载
showmount-e10.1.8.20mount-tnfs10.1.8.20:/shares/webapp /var/www/htmldf-h|grepwww6.3 验证多客户端数据互通
在 client1 创建文件:
touch/var/www/html/xiyangyangclient2 直接可见该文件,证明两台Web节点共用同一存储:
ls/var/www/html/# root-f1 web1.html xiyangyang七、集群Web共享存储实战验证
在 nfs-client1 首页写入内容:
echoheihei>/var/www/html/index.html分别访问两台Web节点地址:
- http://10.1.8.21
- http://10.1.8.22
两台服务器页面完全一致,实现集群统一静态资源存储。
八、开机自动持久化挂载(/etc/fstab)
手动挂载重启后失效,写入/etc/fstab实现开机自动挂载。
8.1 nfs-client1 配置开机挂载
vim/etc/fstab文件末尾追加一行:
10.1.8.20:/shares/webapp /var/www/html nfs defaults008.2 nfs-client2 同步配置
vim/etc/fstab同样添加:
10.1.8.20:/shares/webapp /var/www/html nfs defaults008.3 重启验证自动挂载
两台客户端分别重启:
reboot重启后执行挂载查询,无需手动mount即可自动加载:
df-h|grepwww# 依然能看到NFS挂载条目九、总结
- NFS 依靠 RPC 端口映射实现跨主机文件共享,架构简单、适配 Linux 集群场景;
root_squash是核心安全机制,线上环境不建议随意开启no_root_squash;- Web 集群搭配 NFS 共享静态资源,可实现多节点网站内容完全同步;
- 生产环境优化建议:使用 NFSv4、搭配防火墙 IP 白名单、结合 VPN 提升安全性,避免公网直接暴露 NFS 服务。