文件共享存储NFS


没有NFS时网站存在的问题
1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。
2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以
B用户无法看到A用户传的图片。

image-20240527153757949

nfs基本概念

NFS是Network File System的缩写及网络文件系统。 NFS 主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS 系统和 Windows 网络共享、网络驱动器类似, 只不过 windows 用于局域网, NFS用于企业集群架构中,
如果是大型网站, 会用到更复杂的分布式文件系统 FastDFS,glusterfs,HDFS

为什么要使用共享目录

1.实现多台服务器之间数据共享
2.实现多台服务器之间数据一致

有NFS共享存储时

1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储
2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

image-20240527153936604

nfs的工作原理

image-20240527154016351

1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的方式传递给NFS服务端。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。

部署nfs

主机 wanip lanip 角色 应用
nfs 31 31 NFS服务端,提供共享目录的机器(rsync的客户端 serync) nfs-server、rpc,serync
web01 7 7 NFS客户端,用户上传数据的地方,挂载服务端的共享目录 nfs rpc
web02 8 8 NFS客户端,用户上传数据的地方,挂载服务端的共享目录 nfs rpc
backup 41 41 NFS服务端的备胎,需要实时同步nfs的数据 nfs-server、rpc、rsync

安装部署nfs(服务端)

## centos 6
# 1.安装nfs服务端
[root@nfs ~]# yum -y install nfs-utils rpcbind
# 启动服务
[root@localhost ~]# /etc/init.d/rpcbind start
[root@localhost ~]# /etc/init.d/nfs start
# 停止服务
[root@localhost ~]# /etc/init.d/rpcbind stop
[root@localhost ~]# /etc/init.d/nfs stop
## centos 7
# 1.安装nfs服务端
[root@nfs ~]# yum -y install nfs-utils
# 2.修改配置文件
[root@nfs ~]# vim /etc/exports
/web/data 172.16.1.0/24(rw,sync,all_squash)
# 3.启动服务
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl start nfs
# 4.创建共享目录
[root@nfs ~]# mkdir /web/data -p
# 5.修改共享目录权限
[root@nfs ~]# chown -R nfsnobody.nfsnobody /web/data/

客户端操作

# 1.查看共享目录
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/web/data 172.16.1.0/24
# 2.挂载命令
[root@web01 ~]# mount -t nfs 172.16.1.31:/web/data /var/www/html/
# 3.检查挂载
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.5G 18G 9% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 497M 120M 378M 25% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/web/data 19G 1.5G 18G 8% /var/www/html

nfs开机自动挂载

# NFS排错是否配置文件加载成功
[root@nfs data]# cat /var/lib/nfs/etab
172.16.1.31:/web/data /var/www/html/user_data nfs
defaults 0 0
在企业工作场景,通常情况NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid、exec 等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。例如: 很多木马篡改站点文件都是由上传入口上传的程序到存储目录。然后执行的。
#通过mount -o指定挂载参数,禁止使用suid,exec,增加安全性能
[root@nfs-client ~]# mount -t nfs -o nosuid,noexec,nodev 172.16.1.31:/data /mnt

nosuid:禁止执行 SUID(Set User ID)程序。SUID 是一种权限设置,允许普通用户以文件所有者的权限执行可执行文件。禁用 SUID 可以增加安全性,防止恶意程序利用这个权限。
noexec:禁止在挂载的文件系统上执行二进制文件。这对于存储数据而不是执行程序的目录很有用,可以提高安全性。
nodev:禁止创建设备文件。这样可以防止在挂载的目录中创建设备节点,增加了安全性。
#通过mount -o指定挂载参数,禁止更新目录及文件时间戳挂载
[root@nfs-client ~]# mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt

noatime:禁止更新文件的访问时间戳(access time)。默认情况下,每次访问文件时,系统都会更新文件的访问时间戳,但使用noatime选项后,系统不再更新这个时间戳,从而减少了磁盘I/O操作,提高了性能。
nodiratime:类似于noatime,但是只影响目录的访问时间戳。如果你不希望目录的访问时间戳被更新,可以使用这个选项

nfs配置文件

/web/data 172.16.1.0/24(rw,sync,all_squash)
rw:可读可写
ro:只读
sync:数据同时同步到内存和磁盘上(同步)
async:数据先写入内存,然后再写入磁盘(异步)
root_squash:当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用)
no_root_squash:当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
all_squash:无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
no_all_squash:无论NFS客户端使用什么账户访问,都不进行压缩
anonuid:配置all_squash使用,指定NFS的用户UID,必须存在系统
anongid:配置all_squash使用,指定NFS的用户UID,必须存在系统
/web/data 172.16.1.0/24(rw,sync,anonuid=1000,anongid=1000,all_squash)