NFS介绍
NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。
NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。
什么是RPC
由于NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口才无法固定,而是随机取用一些未使用的端口来作为传输之用,其中centos5.x随机端口为小于1024的,而centos6.x随机端口都是较大的。
因为端口不固定,这样一来就会造成客户端与NFS服务器端的通讯障碍,由于NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信交互数据。
解决以上问题,我们需要RPC服务来帮忙,NFS的RPC服务主要的功能是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而可以确保客户端连接正确的NFS端口上去,达到实现数据传输交互数据目的。RPC相当于NFS服务的中介。
如图所示:NFS工作流程简图
大致如以下几点:
1、首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能的询问请求,这时NFS客户端(即执行程序的服务器)RPC服务(portmap或rpcbind服务)就会通过网络向NFS服务端的RPC服务(portmap或rpcbind)的111端口发出NFS文件存取功能的询问请求。
2、NFS服务器端的RPC服务(即portmap或rpcbind)找到对应的已注册的NFS daemon端口后,通知NFS客户端的RPC服务(即portmap或rpcbind服务)
3、此时NFS客户端就可以获取到正确的端口,然后就直接与NFS daemon联机存取数据了。
4、NFS客户端把数据存取成功后,返回给当前访问程序,告知用户存取结果,作为网站用户,我们就完成了一次存取操作。 由于NFS的各项功能都需要想RPC服务注册,所以RPC服务才能获取到NFS服务的各项功能对应的端口、PID、NFS在主机所监听的IP等,NFS客户端才能够通过向RPC服务询问才找到正确的端口。也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。由上面的描述,我们不难推出:无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务,然后在启动NFS服务,客户端可以不启动NFS服务。
安装配置NFS服务器
使用docker容器配置NFS服务器
1) 启动centos容器并进入
docker run -d –privileged centos:v1 /usr/sbin/init
2) 在centos容器中使用yum方式安装nfs-utilsyum install nfs-utils
3) 保存容器为镜像
#docker commit 容器ID nfs
4) 启动容器nfs,设定地址为172.18.0.120
#docker run -d –privileged –net cluster –ip 172.18.0.120 –name nfs nfs /usr/sbin/init
5) 启动nfs服务,查看监听端口systemctl start nfs-server
7) 新建共享目录/var/www/share,设置权限为777
8) 编辑/etc/exports文件/var/www/share 172.18.0.*(rw,sync)
9) 导出nfs共享目录exportfs -rv
10) 查看nfs上的共享目录
#showmount -e IP地址1
2
3[root@c90e05748250 /]# showmount -e 172.18.0.1
Export list for 172.18.0.1:
/var/www/share 172.18.0.*
使用宿主机配置NFS服务器
1) yum install nfs-utils
//在宿主机安装nfs
2) 查看nfs配置文件1
2more /etc/nfs.onf
more /etc/nfsmount.conf
3) 启动nfs服务,查看监听端口
systemctl start nfs-server
4) 新建共享目录/var/www/share,设置权限为777
5) 编辑/etc/exports文件/var/www/share 172.18.0.*(rw,sync)
6) 导出nfs共享目录#exportfs -rv
7) 查看nfs上的共享目录
#showmount -e IP地址1
2
3showmount -e 172.18.0.1
Export list for 172.18.0.1:
/var/www/share 172.18.0.*
启用APP1和APP2两个容器,挂载共享目录
1) 启动容器APP1,设定地址为172.18.0.111
docker run -d –privileged –net cluster –ip 172.18.0.111 –name APP1 php-apache /usr/sbin/init
2) 启动容器APP2,设定地址为172.18.0.112
docker run -d –privileged –net cluster –ip 172.18.0.112 –name APP2 php-apache /usr/sbin/init
3) yum install nfs-utils
//进入容器并安装nfs
4) #showmount -e 172.18.0.1 //在APP1查看nfs上的共享目录1
2
3showmount -e 172.18.0.1
Export list for 172.18.0.1:
/var/www/share 172.18.0.*
5) 共享目录挂在到本地目录1
2mkdir /var/www/share
mount 172.18.0.1:/var/www/share /var/www/share
6) 在APP1的/var/www/share上读写文件,在nfs上查看
7) APP2按以上步骤配置
配置nginx1、APP1实现动静分离
在APP1上编写PHP脚本,上传资源文件
1) vim /var/www/index.php //在APP1上编辑php文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function serverIp(){ //获取服务器IP地址
if(isset($_SERVER)){
if($_SERVER['SERVER_ADDR']){
$server_ip=$_SERVER['SERVER_ADDR'];
}else{
$server_ip=$_SERVER['LOCAL_ADDR'];
}
}else{
$server_ip = getenv('SERVER_ADDR');
}
return $server_ip;
}
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>动静分离测试</title>
<link rel="stylesheet" type="text/css" href="share/banner.css">
<script type="text/javascript" src="share/jquery-1.7.2.min.js"></script>
</head>
<body>
<div class="banner">
<ul>
<li><img src="share/banner_02.jpg" /></li>
<li><img src="share/banner_01.gif" /></li>
</ul>
</div>
<div class="main_list">
<ul>
<li><a href="#">动静分离测试...</a></li>
<li><a href="#">动静分离测试...</a></li>
</ul>
</div>
<span>echo serverIp(); </span>
</body>
</html>
4) 把图片资源文件上传到APP1服务器的 /var/www/share
目录
5) 在宿主机nfs服务器的 /var/www/share目录中检查文件是否存在
6) 在宿主机使用curl访问http://172.18.0.111/index.php
配置nginx反向代理,访问APP1
1) 启动容器nginx1,设定地址为172.18.0.11,把80端口映射到宿主机8080
docker run -d –privileged –net cluster –ip 172.18.0.11 -p 8080:80 –name nginx1 nginx-keep /usr/sbin/init
2) 在nginx1上编辑/etc/nginx/nginx.conf,重启nginx服务1
2
3
4
5
6server {
listen 80;
server_name localhost;
location / {
proxy_pass http://172.18.0.111;
}
3) 在主机使用浏览器访问http://192.168.*.100/index.php
这里肯定显示不了图片 因为网站的根目录为/var/www/html
而share目录在/var/www
下
配置nginx反向代理,宿主机nginx,支持动静分离
1) 在nfs宿主机编辑/etc/nginx/conf.d/ default.conf,启用nginx服务1
2
3
4
5
6
7
8server {
listen 80;
server_name file.test.com;
location / {
root /var/www;
index index.html index.htm;
}
}
2) 在nginx1上编辑/etc/nginx/nginx.conf,重启nginx服务1
2
3
4
5
6
7
8
9
10server {
listen 80;
server_name localhost;
location / {
proxy_pass http://172.18.0.111;
}
location /share {
proxy_pass http://172.18.0.1/share;
}
}
3) 在主机使用浏览器访问http://192.168.*.100/index.php
配置nginx1、APP1、APP2、宿主机nfs和nginx,支持负载均衡动静分离
1) 仿照步骤1,在APP2上编写PHP脚本,上传资源文件
3) 在nginx1上编辑/etc/nginx/nginx.conf,重启nginx服务1
2
3
4
5
6
7
8
9
10
11
12
13
14server {
listen 80;
server_name localhost;
location / {
proxy_pass http://APP;
}
location /share {
proxy_pass http://172.18.0.1/share;
}
upstream APP {
server 172.18.0.111;
server 172.18.0.112;
}
}
4) 在主机使用浏览器访问http://192.168.*.100/index.php