一、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用户传的图片。

2.有NFS服务的时候

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

三、NFS原理

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

四、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可以访问

最新文章

  1. iOS 10 跳转系统设置
  2. JavaScript模板引擎artTemplate.js——是否编码输出html字符
  3. 锁(MySQL篇)—之MyISAM表锁
  4. SLES 10安装Oracle10gR2笔记
  5. POI 解析xls
  6. Web API在OWIN下实现OAuth
  7. 重放攻击(Replay Attacks)
  8. paip.一千 常用汉字 高频汉字 覆盖率90%
  9. skymvc文件上传支持多文件上传
  10. 每个线程分配一个stack,每个进程分配一个heap;heap没有结构,因此寻址慢(转)
  11. 数据存储与访问之——初见SQLite数据库
  12. Servlet中过滤器的执行流程
  13. Linux网络编程“惊群”问题总结
  14. Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
  15. dubbo和zikkeper的使用
  16. vue axios中文文档详解
  17. JDBC概述
  18. 【Entity Framework】disable automatic migration, 执行update-migration仍然会显示有automatic migration
  19. CAN-bus接口控制实验
  20. 云数据库Redis版256M双机热备款

热门文章

  1. python中的n次方表示法 **n
  2. 解压gzip格式文件(包括网页)
  3. 被喷了!聊聊我开源的RPC框架那些事
  4. python中的画笔控制函数
  5. 第二篇 配置wcf
  6. 机器学习-线性规划(LP)
  7. Oracle学习(三)SQL高级--表结构相关(建表、约束)
  8. 模式串 从 0 开始的KMP算法
  9. 036 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 03 嵌套if结构
  10. 【随笔】Apache降权和禁用PHP危险函数