官方文档html
NFS(Network File System)
即网络文件系统,它最大的功能就是经过TCP/IP
网络共享资源。在NFS
的应用中,本地NFS
的客户端应用能够透明地读写位于远端NFS
服务器上的文件,就像访问本地文件同样。linux
NFS
客户端通常是应用服务器(好比web
,负载均衡等),能够经过挂载的方式将NFS
服务器端共享的目录挂载到NFS
客户端本地的目录下。nginx
由于NFS
支持的功能至关的多,而不一样的功能都会使用不一样的程序来启动,每启动一个功能就会启用一些端口来传输数据,所以,NFS
的功能所对应的端口才没有固定住,而是随机取用一些未被使用的小于1024
的端口来做为传输之用。但如此一来又形成了客户端想要连上服务器时的困扰,由于客户端得要知道服务器端的相关端口才可以进行链接。web
所以就须要远程过程调用(RPC)
的服务,RPC
最主要的功能就是在指定每一个NFS
功能所对应的port number
,而且回报给客户端,让客户端能够链接正确的端口上去。那RPC
又是如何知道每一个NFS
的端口呢?这是由于当服务器在启动NFS
时会随机取用数个端口,并主动的想RPC
注册,所以RPC
能够知道每一个端口对应的NFS
功能,而后RPC
又是固定使用port 111
来监听客户端的需求并回报给客户端正确的端口,因此固然可让NFS
的启动更为轻松愉快了。vim
NFS
在文件传送过程当中依赖与RPC
(远程过程调用)协议。NFS
自己是没有提供信息传送的协议和功能的,可是可以用过网络进行图片,视频,附件等分享功能。只要用到NFS的地方都须要启动RPC
服务,不管是NFS
的服务端仍是客户端。centos
NFS
和RPC
的关系:能够理解为NFS
是一个网络文件系统(比喻为租房的房主),而RPC
是负责信息的传输(中介),客户端(至关于租房的租客)。服务器
实现数据共享,数据保持一致。如图所示:网络
一、在nfs
服务器端建立共享目录
二、经过mount
网络挂载,将NFS
服务端共享目录挂载到NFS
客户端本地目录
三、NFS
客户端在挂载目录上建立、删除、查看数据等操做,等价于在服务端进行的建立、删除、查看数据等操做。架构
如上图所示,在NFS
服务器端设置一个共享目录/web
后,其余有权限访问NFS
服务器端的客户端均可以将这个共享目录/web
挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点能够本身随意指定),不一样的客户端的挂载点能够不相同。app
客户端正确挂载完毕后,就能够经过NFS
客户端的挂载点所在的/opt/www
目录查看到NFS
服务端/web
共享出来的目录下的全部数据。在客户端查看时,NFS
服务端的/web
目录就至关于客户端本地的磁盘分区或目录,几乎感受不到使用上的区别,根据NFS
服务器端授予的NFS
共享权限以及共享目录的本地系统权限,只要在指定的NFS
客户端操做挂载的/opt/www
目录,就能够将数据轻松的存取到NFS
服务器端上的/web
目录中了。
操做系统 | 角色 | IP | HOST |
---|---|---|---|
CentOS release 7.4 | NFS Server | 192.168.1.31 | nfs-server.com |
CentOS release 7.4 | NFS Client1 (web server1) | 192.168.1.32 | nfs-client1.com |
CentOS release 7.4 | NFS Client2 (web server2) | 192.168.1.33 | nfs-client2.com |
说明:
这里NFS
客户端是web
服务器,站点目录挂载NFS
服务端。
实验环境关闭防火墙、selinux、时间同步等
服务端安装配置
1)检查是否安装NFS、RPC
服务
[root@nfs-server ~]# rpm -aq |egrep "nfs-utils|rpcbind" rpcbind-0.2.0-42.el7.x86_64 nfs-utils-1.3.0-0.48.el7.x86_64 # 若是没有安装则进行安装 # yum -y install nfs-utils rpcbind
2)启动rpc
和nfs
服务
[root@nfs-server ~]# systemctl start rpcbind [root@nfs-server ~]# systemctl enable rpcbind [root@nfs-server ~]# systemctl start nfs
3)能够经过rpcinfo -p localhost
能够查看到绑定了nfs
[root@nfs-server ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100024 1 udp 60358 status 100024 1 tcp 34912 status 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 100021 1 udp 38577 nlockmgr 100021 3 udp 38577 nlockmgr 100021 4 udp 38577 nlockmgr 100021 1 tcp 42193 nlockmgr 100021 3 tcp 42193 nlockmgr 100021 4 tcp 42193 nlockmgr
4)配置共享目录并重启nfs
[root@nfs-server ~]# mkdir /web [root@nfs-server ~]# vim /etc/exports /web 192.168.1.0/24(rw,sync,no_root_squash) #不压制root(当client端使用root挂载时,也有root权限) [root@nfs-server ~]# systemctl restart nfs [root@nfs-server ~]# exportfs -v /web 192.168.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
客户端挂载测试
1)建立挂载目录并进行挂载
[root@nfs-client1 ~]# mkdir /opt/www [root@nfs-client1 ~]# showmount -e 192.168.1.31 #查看服务器共享目录 Export list for 192.168.1.31: /web 192.168.1.0/24 [root@nfs-client1 ~]# mount -t nfs 192.168.1.31:/web /opt/www/ [root@nfs-client1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 20G 3.6G 16G 19% / devtmpfs 473M 0 473M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 14M 475M 3% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 497M 154M 344M 31% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.1.31:/web 20G 3.6G 16G 19% /opt/www [root@nfs-client1 ~]# [root@nfs-client1 ~]# vim /etc/fstab #开机自动挂载 192.168.1.31:/web /opt/www nfs defaults 0 0
2)在client1
上的/opt/www
建立一个测试文件
[root@nfs-client1 ~]# echo "client1 create test file" >> /opt/www/client1.txt
3)回到nfs
上进行查看
[root@nfs-server ~]# ll /web/ 总用量 4 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt
4)安装nginx
并配置站点目录为/opt/www
[root@nfs-client1 ~]# yum -y install nginx [root@nfs-client1 ~]# vim /etc/nginx/nginx.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /opt/www; ... [root@nfs-client1 ~]# systemctl start nginx
上面的步骤一样在client2
上面操做。
在nfs服务端建立站点首页,访问client客户端测试
[root@nfs-server ~]# ll /web/ 总用量 8 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt -rw-r--r-- 1 root root 25 8月 9 15:37 client2.txt [root@nfs-server ~]# echo "<h1>NFS server</h1>" >> /web/index.html #nfs服务端共享目录建立首页文件 [root@nfs-server ~]# curl 192.168.1.32 <h1>NFS server</h1> [root@nfs-server ~]# [root@nfs-server ~]# curl 192.168.1.33 <h1>NFS server</h1> [root@nfs-client1 ~]# ll /opt/www/ #nfs客户端1上查看 总用量 12 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt -rw-r--r-- 1 root root 25 8月 9 15:37 client2.txt -rw-r--r-- 1 root root 20 8月 9 15:41 index.html [root@nfs-client2 ~]# ll /opt/www/ #nfs客户端2上查看 总用量 12 -rw-r--r-- 1 root root 25 8月 9 14:41 client1.txt -rw-r--r-- 1 root root 25 8月 9 15:37 client2.txt -rw-r--r-- 1 root root 20 8月 9 15:41 index.html
经过测试能够看出,客户端挂载后,就彻底至关于本身的一个目录或者文件,在负载均衡架构中通常经过这种方式作共享存储。
经过 man exports
能够查看帮助手册
共享参数 | 做用 |
---|---|
rw* | 读写权限 |
ro | 只读权限 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不经常使用) |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(经常使用) |
all_squash | 不管NFS客户端使用什么帐户访问,均映射为NFS服务器的匿名用户(经常使用) |
no_all_squash | 不管NFS客户端使用什么帐户访问,都不进行压缩 |
sync* | 同时将数据写入到内存与硬盘中,保证不丢失数据 |
async | 优先将数据保存到内存,而后再写入硬盘;这样效率更高,但可能会丢失数据 |
anonuid* | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
anongid* | 配置all_squash使用,指定NFS的用户GID,必须存在系统 |
[root@nfs-server ~]# cat /etc/exports #/web 192.168.1.0/24(rw,sync,no_root_squash) #不压制root(当client端使用root挂载时,也有root权限) /web 192.168.1.32(rw,sync,no_root_squash) 192.168.1.33(rw,sync,all_squash,anonuid=2000,anongid=2000)
#[共享目录] [客户端地址1(权限)] [客户端地址2(权限)] 1、共享目录:每一行最前面是共享出来的目录,好比上面我要共享/web目录,那么此选项就能够直接写/web目录,这个目录能够依照不一样的权限共享给不一样的目录。 2、客户端地址:客户端地址可以设置一个网络,也能够是单个主机。参数:如上面的读写权限rw,同步更新sync等待。 1、客户端地址可使用完整的IP或者网络号,例如192.168.1.33或192.168.1.0/24 2、一样可使用主机名,可是这个主机名必需要在/etc/hosts中存在,或者能够经过DNS找到才行。