一、NFS服务介绍

1.什么是NFS?
是一个共享存储,文件服务器

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

3.为什么使用NFS?
1)实现多台服务器之间文件共享
2)实现多台服务器之间数据一致

二、NFS简单应用

1.没有NFS服务

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

NFS和DFS NFS和DFS的区别_apache

2.有NFS服务的时候

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

NFS和DFS NFS和DFS的区别_html_02

三、NFS原理

1.用户进程访问NFS客户端目录
2.NFS将请求转化成函数
3.NFS客户端与服务端建立TCP\IP连接
4.NFS服务端接收请求,会调用portmap进行端口映射
5.服务端rpc.NFSd进程进行判断NFS客户端是否可以连接
6.如果可以连接,rpc.mount进程会对客户端进行判断允许的操作
7.都通过则可以对服务端磁盘进行操作

NFS和DFS NFS和DFS的区别_apache_03

四、NFS安装

主机

IP

角色

nfs

172.16.1.31

服务端

web01

172.16.1.7

客户端

1.服务端安装

1.关闭防火墙
[root@NFS ~]# systemctl stop firewalld
[root@NFS ~]# systemctl disable firewalld

2.关闭selinux
[root@NFS ~]# setenforce 0
[root@NFS ~]# vim /etc/selinux/config
SELINUX=disabled

3.安装NFS和rpcbind
[root@NFS ~]# yum install -y NFS-utils rpcbind

#如果是centos6需要单独安装rpcbind,centos7可以不单独安装

4.配置
	NFS服务程序的配置文件为/etc/exports,需要严格按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式书写,定义要共享的目录与相应的权限,具体书写方式如下图所示。

[root@NFS ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)

5.创建数据目录
[root@NFS ~]# mkdir /data

6.启动NFS服务
[root@NFS ~]# systemctl start rpcbind NFS-server

#如果是centos6,启动时必须先启动rpcbind,centos7会自动启动

#验证启动
[root@NFS ~]# ps -ef | grep NFS

7.验证DFS配置
[root@NFS ~]# cat /var/lib/NFS/etab 
/data	172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pNFS,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)

2.客户端安装

1.关闭防火墙
[root@web01 ~]# systemctl stop firewalld
[root@web01~]# systemctl disable firewalld

2.关闭selinux
[root@web01 ~]# setenforce 0
[root@web01 ~]# vim /etc/selinux/config
SELINUX=disabled

3.安装NFS和rpcbind
[root@web01 ~]#yum install -y NFS-utils rpcbind

4.查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

5.启动rpcbind
[root@web01 ~]# systemctl start rpcbind

6.挂载
[root@web01 ~]# mkdir /data
[root@web01 ~]# mount -t NFS 172.16.1.31:/data /data

#验证
[root@web01 ~]# df -h
172.16.1.31:/data   98G  1.2G   97G   2% /data

7.写入文件测试
[root@web01 ~]# cd /data
[root@web01 /data]# mkdir dir
mkdir: cannot create direct‘dir’: Permission denied
#权限不足,服务端data目录权限是root

#服务端修改权限
[root@NFS ~]# chown -R NFSnobody.NFSnobody /data/

#客户端再次写入数据
[root@web01 /data]# mkdir dir
[root@web01 /data]# ll
total 0
drwxr-xr-x 2 NFSnobody NFSnobody 6 Aug 13 23:43 dir

五、NFS服务的使用

1.NFS服务/etc/exports配置文件
| 语法     | /data      | 172.16.1.0/24    | (rw,sync,all_squash)      |

| 语法含义 | 共享的目录 | 允许连接的客户端网段 | 允许的操作(参数1,参数2) |

2.挂载
NFS客户端的配置步骤也十分简单。先使用showmount命令,查询NFS服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址”。

3.查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

4.挂载命令
[root@web01 ~]# mount -t NFS 172.16.1.31:/data /data
mount			#挂载命令
-t				#指定挂载的文件类型
NFS				#挂载类型是NFS
172.16.1.31		#远端挂载的主机IP
:/data 			#远端挂载的主机目录
/data			#本地要挂载的目录

5.卸载命令
[root@web01 ~]# umount 172.16.1.31:/data
[root@web01 ~]# umount /data

6.卸载时注意事项
#卸载时,不要在要卸载的目录里面进行卸载
[root@web01 /data]# umount /data
umount.NFS4: /data: device is busy

#强制卸载
[root@web01 /data]# umount -lf /data

#注意
1)卸载时,不要在要卸载的目录里面进行卸载
2)执行挂载目录时,本地要挂载的目录尽量不要有数据,如果有数据,不会丢失只是被盖住,取消挂载后仍然存在

六、NFS配置详解

nfs共享参数

参数作用

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的用户UID,必须存在系统

七、NFS服务实战(搭建上传作业页面)

1.需求

1.部署NFS客户端和服务端
2.搭建web01和web02的交作业页面
3.实现web01与web02的文件共享

2.准备服务器

主机

外网IP

web01

10.0.0.7

web02

10.0.0.8

nfs

10.0.0.31

3.web01客户端

1.关闭防火墙
[root@web01 ~]# systemctl stop firewalld
[root@web01 ~]# systemctl disable firewalld

2.关闭selinux
[root@web01 ~]# setenforce 0         
[root@web01 ~]# vim /etc/selinux/config
SELINUX=disabled

3.安装http服务和php服务
[root@web01 ~]# yum -y install  httpd php

4.上传代码到本地,解压至/var/www/html下
[root@web01 ~]# rz -bye
[root@web01 ~]# ll
-rw-r--r--  1 root root 26995 Aug 13 16:42 kaoshi.zip
[root@web01 ~]# unzip kaoshi.zip  -d /var/www/html/
Archive:  kaoshi.zip
  inflating: /var/www/html/info.php  
  inflating: /var/www/html/bg.jpg    
  inflating: /var/www/html/index.html  
  inflating: /var/www/html/upload_file.php  

5.授权站点目录
[root@web01 ~]# chown -R apache:apache  /var/www/html/

6.重启http服务
[root@web01 ~]# systemctl  restart  httpd

7.验证http服务
[root@web01 ~]# ps aux |grep http
root       8715  0.2  0.5 314580 12132 ?        Ss   19:27   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8717  0.0  0.3 314712  6160 ?        S    19:27   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8718  0.0  0.3 314712  6160 ?        S    19:27   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8719  0.0  0.3 314712  6160 ?        S    19:27   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8720  0.0  0.3 314712  6160 ?        S    19:27   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8721  0.0  0.3 314712  6160 ?        S    19:27   0:00 /usr/sbin/httpd -DFOREGROUND
root       8727  0.0  0.0 112708   976 pts/1    S+   19:28   0:00 grep --color=auto http

8.通过浏览器访问10.0.0.7出现上传作业界面

4.web02客户端

1.关闭防火墙
[root@web02 ~]# systemctl stop firewalld
[root@web02 ~]# systemctl disable firewalld

2.关闭selinux
[root@web02 ~]# setenforce 0         
[root@web02 ~]# vim /etc/selinux/config
SELINUX=disabled

3.安装http服务和php服务
[root@web02 ~]# yum -y install  httpd php

4.上传代码到本地,解压至/var/www/html下
[root@web02 ~]# rz -bye
[root@web02 ~]# ll
-rw-r--r--  1 root root 26995 Aug 13 16:42 kaoshi.zip
[root@web02 ~]# unzip kaoshi.zip  -d /var/www/html/
Archive:  kaoshi.zip
  inflating: /var/www/html/info.php  
  inflating: /var/www/html/bg.jpg    
  inflating: /var/www/html/index.html  
  inflating: /var/www/html/upload_file.php  
  
5.授权站点目录
[root@web02 ~]# chown -R apache:apache  /var/www/html/


6.重启http服务
[root@web02 ~]# systemctl  restart  httpd

7.验证http服务
[root@web02 ~]# ps aux |grep http
root       8755  0.2  0.5 314580 12128 ?        Ss   19:34   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8756  0.0  0.3 314712  6160 ?        S    19:34   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8757  0.0  0.3 314712  6160 ?        S    19:34   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8758  0.0  0.3 314712  6160 ?        S    19:34   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8759  0.0  0.3 314712  6160 ?        S    19:34   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8760  0.0  0.3 314712  6160 ?        S    19:34   0:00 /usr/sbin/httpd -DFOREGROUND
root       8764  0.0  0.0 112708   972 pts/1    S+   19:34   0:00 grep --color=auto http

8.通过浏览器访问10.0.0.8出现上传作业界面

5.测试上传文件

在10.0.0.7的服务器上传 1_web01.jpg
在10.0.0.8的服务器上传 2_web02.jpg

#web01访问测试
http://10.0.0.7/upload/1_web01.jpg 访问成功
http://10.0.0.7/upload/2_web02.jpg	访问失败

#web02访问测试
http://10.0.0.8/upload/1_web01.jpg	访问失败
http://10.0.0.8/upload/2_web02.jpg	访问成功

#web01上传文件,web02无法访问
#web02上传文件,web01无法访问

6.NFS服务端

1.关闭防火墙
[root@NFS ~]#systemctl stop firewalld
[root@NFS ~]# systemctl disable firewalld

2.关闭selinux
[root@NFS ~]# setenforce 0         
[root@NFS ~]# vim /etc/selinux/config
SELINUX=disabled

3.安装NFS服务和rpcbind
[root@NFS ~]# yum -y install NFS-utils rpcbind

4.编辑配置文件
[root@NFS ~]# vim /etc/exports
/web/data	172.16.1.0/24(rw,sync,all_squash)

5.创建数据目录
[root@NFS ~]# mkdir -p /web/data

6.启动NFS服务
[root@NFS ~]# systemctl start rpcbind NFS-server

#验证启动
[root@NFS ~]# ps aux |grep NFS
root       8983  0.0  0.0      0     0 ?        S<   19:59   0:00 [NFSd4_callbacks]
root       8989  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       8990  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       8991  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       8992  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       8993  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       8994  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       8995  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       8996  0.0  0.0      0     0 ?        S    19:59   0:00 [NFSd]
root       9007  0.0  0.0 112708   976 pts/1    R+   19:59   0:00 grep --color=auto NFS

7.验证DFS配置
[root@NFS ~]# cat /var/lib/NFS/etab 
/web/data	172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pNFS,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)

8.服务端修改权限
[root@NFS ~]# chown  -R NFSnobody:NFSnobody  /web/

7.实现文件共享

1.web01客户端

1)安装NFS服务和rpcbind
[root@web01 ~]#yum -y install  NFS-utils rpcbind
	
2)查看挂载点
[root@web01 ~]# showmount  -e 172.16.1.31
Export list for 172.16.1.31:
/web/data 172.16.1.0/24

3)启动rpcbind
[root@web01 ~]# systemctl  start rpcbind

4)挂载
[root@web01 ~]# mount -t NFS 172.16.1.31:/web/data /var/www/html/upload

#验证
[root@web01 ~]# df -h
172.16.1.31:/web/data   98G  1.6G   96G   2% /var/www/html/upload

5)写入文件测试
[root@web01 ~]# cd /var/www/html/upload/
[root@web01 /var/www/html/upload]# touch 1.txt

6)服务端查看/web/data目录
[root@NFS ~]# ll /web/data/
total 0
-rw-r--r-- 1 NFSnobody NFSnobody 0 Aug 13 20:31 1.txt


2.web02客户端
1)安装NFS服务和rpcbind
[root@web02 ~]#yum -y install  NFS-utils rpcbind
	
2)查看挂载点
[root@web02 ~]# showmount  -e 172.16.1.31
Export list for 172.16.1.31:
/web/data 172.16.1.0/24

3)启动rpcbind
[root@web02 ~]# systemctl  start rpcbindsystemctl  start rpcbind

4)挂载
[root@web02 ~]# mount -t NFS 172.16.1.31:/web/data /var/www/html/upload

#验证
[root@web01 ~]# df -h
172.16.1.31:/web/data   98G  1.7G   96G   2% /var/www/html/upload

5)写入文件测试
[root@web02 ~]# cd /var/www/html/upload/
[root@web02 /var/www/html/upload]# touch 2.txt

6)服务端查看/web/data目录
[root@NFS ~]# ll /web/data/
total 0
-rw-r--r-- 1 NFSnobody NFSnobody 0 Aug 13 20:31 1.txt
-rw-r--r-- 1 NFSnobody NFSnobody 0 Aug 13 20:36 2.txt

8.再次测试

#重新上传图片
在10.0.0.7的服务器上传 1_web01.jpg
在10.0.0.8的服务器上传 2_web02.jpg

#web01访问测试
http://10.0.0.7/upload/1_web01.gif  访问成功
http://10.0.0.7/upload/2_web02.jpg	访问成功

#web02访问测试
http://10.0.0.8/upload/1_web01.gif	访问成功
http://10.0.0.8/upload/2_web02.jpg	访问成功

#web01上传文件,web02可以访问
#web02上传文件,web01可以访问