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

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

  6. 新建共享目录/var/www/share,设置权限为777

  7. 编辑/etc/exports文件
    /var/www/share 172.18.0.*(rw,sync)

  8. 导出nfs共享目录
    exportfs -rv

  9. 查看nfs上的共享目录
    #showmount -e IP地址

[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配置文件

more /etc/nfs.onf  
more /etc/nfsmount.conf 
  1. 启动nfs服务,查看监听端口

systemctl start nfs-server

  1. 新建共享目录/var/www/share,设置权限为777

  2. 编辑/etc/exports文件
    /var/www/share 172.18.0.*(rw,sync)

  3. 导出nfs共享目录
    #exportfs -rv

  4. 查看nfs上的共享目录
    #showmount -e IP地址

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上的共享目录
showmount -e 172.18.0.1
Export list for 172.18.0.1:
/var/www/share 172.18.0.*
  1. 共享目录挂在到本地目录
mkdir /var/www/share
mount 172.18.0.1:/var/www/share  /var/www/share  
  1. 在APP1的/var/www/share上读写文件,在nfs上查看

  2. APP2按以上步骤配置

配置nginx1、APP1实现动静分离

在APP1上编写PHP脚本,上传资源文件

  1. vim /var/www/index.php //在APP1上编辑php文件
<?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>
  1. 把图片资源文件上传到APP1服务器的 /var/www/share目录

  2. 在宿主机nfs服务器的 /var/www/share目录中检查文件是否存在

  3. 在宿主机使用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服务
server {
    listen       80;
    server_name  localhost;
    location / {
     proxy_pass http://172.18.0.111;
    }
  1. 在主机使用浏览器访问http://192.168.*.100/index.php

这里肯定显示不了图片 因为网站的根目录为/var/www/html而share目录在/var/www

在这里插入图片描述

配置nginx反向代理,宿主机nginx,支持动静分离

  1. 在nfs宿主机编辑/etc/nginx/conf.d/ default.conf,启用nginx服务
server {
    listen       80;
    server_name  file.test.com;
    location / {
        root   /var/www;
        index  index.html index.htm;
    }
}
  1. 在nginx1上编辑/etc/nginx/nginx.conf,重启nginx服务
server {
    listen       80;
    server_name  localhost;
    location / {
     proxy_pass http://172.18.0.111;
    }
   location /share {
     proxy_pass http://172.18.0.1/share;
   }
}
  1. 在主机使用浏览器访问http://192.168.*.100/index.php
    在这里插入图片描述

配置nginx1、APP1、APP2、宿主机nfs和nginx,支持负载均衡动静分离

  1. 仿照步骤1,在APP2上编写PHP脚本,上传资源文件
  2. 在nginx1上编辑/etc/nginx/nginx.conf,重启nginx服务
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;
}
}
  1. 在主机使用浏览器访问http://192.168.*.100/index.php
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值