Just Do IT !

HA高可用与负载均衡入门到实战(八)---- 基于Docker配置NFS实现Nginx动静分离

字数统计: 2.2k阅读时长: 9 min
2020/05/12 Share

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-utils
yum 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
2
more /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
3
showmount -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
3
showmount -e 172.18.0.1
Export list for 172.18.0.1:
/var/www/share 172.18.0.*

5) 共享目录挂在到本地目录

1
2
mkdir /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
<?php
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><?php 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
6
server {
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
8
server {
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
10
server {
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
14
server {
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
在这里插入图片描述

CATALOG
  1. 1. NFS介绍
  2. 2. 什么是RPC
  3. 3. 安装配置NFS服务器
    1. 3.1. 使用docker容器配置NFS服务器
    2. 3.2. 使用宿主机配置NFS服务器
    3. 3.3. 启用APP1和APP2两个容器,挂载共享目录
  4. 4. 配置nginx1、APP1实现动静分离
    1. 4.1. 在APP1上编写PHP脚本,上传资源文件
    2. 4.2. 配置nginx反向代理,访问APP1
    3. 4.3. 配置nginx反向代理,宿主机nginx,支持动静分离
    4. 4.4. 配置nginx1、APP1、APP2、宿主机nfs和nginx,支持负载均衡动静分离