使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群

最近同学出去面试经常会被问到一个问题。

面试官:你说你们公司使用nginx反向代理tornado,部署了多少多少台机器,好像很牛逼的样子,但是我问你,如果主机也就是部署了nginx那台机器并发过大导致宕机了怎么办?

答曰:不考虑带宽峰值的话,比较新的 CPU 跑 nginx 单核每秒能接近 2 万请求,而且nginx如果纯做 HTTP 转发的话,Nginx 的性能高到恐怖,会挂掉很不科学。。。。

面试官:好吧,算你会忽悠,那如果插头被扫地大妈踢掉了怎么办,因为没电导致服务器宕机

答曰:阿里云机房会断电。。。你特么在逗我吧。。

其实负责转发的主机宕机概率很小,但是绝对不是没有,任何事都不是绝对,所谓的高可用架构就是体现在容灾机制上,如果主机宕机我们必须要做预案,万无一失才叫高可用架构,这里我们使用docker-compose来部署nginx-keepalived双机热备机制,vip主机可以进行漂移,这样主机挂掉了,还有备用机可以顶上

Keepalived是Linux下面实现VRRP备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。二者结合,可以构架出比较稳定的软件LB方案。

简单点说,就是keepalived可以将下面这种简单的负载均衡模式

改造成下面这种高可用的架构

当有主机挂掉的时候,服务能瞬间切换到备用机

首先,安装docker和docker-compose按下不表,可以参考这篇文章,在centos7.6上利用docker-compose统一管理容器和服务

建立nginx_keepalived文件夹

建立Dockerfile文件,这里我们使用alpine作为基础镜像,原因很简单,因为它体积小啊

FROM nginx:1.13.5-alpine

RUN apk update && apk upgrade

RUN apk add --no-cache bash curl ipvsadm iproute2 openrc keepalived && 
    rm -f /var/cache/apk/* /tmp/*

COPY entrypoint.sh /entrypoint.sh

RUN chmod +x /entrypoint.sh

CMD ["/entrypoint.sh"]

然后建立docker-compose.yml文件,这里我们仿照线上环境,部署一台主机和一台从机,分别安装nginx

version: "3"
services:
  nginx_master:
    build:
      context: ./
      dockerfile: ./Dockerfile
    volumes:
      - ./index-master.html:/usr/share/nginx/html/index.html
      - ./favicon.ico:/usr/share/nginx/html/favicon.ico
      - ./keepalived-master.conf:/etc/keepalived/keepalived.conf
    networks:
      static-network:
        ipv4_address: 172.20.128.2
    cap_add: 
      - NET_ADMIN
  nginx_slave:
    build:
      context: ./
      dockerfile: ./Dockerfile
    volumes:
      - ./index-slave.html:/usr/share/nginx/html/index.html
      - ./favicon.ico:/usr/share/nginx/html/favicon.ico
      - ./keepalived-slave.conf:/etc/keepalived/keepalived.conf
    networks:
      static-network:
        ipv4_address: 172.20.128.3
    cap_add: 
        - NET_ADMIN
  proxy:
    image: haproxy:1.7-alpine
    ports:
      - 8000:6301
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    networks:
      - static-network

networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16

随后,撰写nginx配置文件,keepalived-master.conf 这里由于我们没有后端tornado服务,所以使用虚拟代理服务

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 33
    priority 200
    advert_int 1
    unicast_src_ip 172.20.128.2
    unicast_peer {
        172.20.128.3
    }
    
    authentication {
        auth_type PASS
        auth_pass letmein
    }
    
    virtual_ipaddress {
        172.20.128.4/24 dev eth0
    }

    track_script {
        chk_nginx
    }
}

同理再复制一份从机的nginx配置keepalived-slave.conf

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 33
    priority 100
    advert_int 1
    unicast_src_ip 172.20.128.3
    unicast_peer {
        172.20.128.2
    }
    
    authentication {
        auth_type PASS
        auth_pass letmein
    }
    
    virtual_ipaddress {
        172.20.128.4/24 dev eth0
    }
    
    track_script {
        chk_nginx
    }
}

随后为后端服务做两个网页,一个主机index-master.html一个从机index-slave.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>主机</title>
<style>

#box{ 
    margin: 0px auto;
    font-family: 'Times New Roman', Times, serif; 
    font-size: 30px;
    font-style: initial;
    color: aliceblue;
    }

body{
    background-color: black
}

</style>
</head>
<body>

    <div id="box">

        主机

    </div>
    
</body>
</html>

从机的复制一份,将主机改成从机即可

因为我们要模拟后台服务,所以需要haproxy.cfg配置文件

global
    log 127.0.0.1 local0
    maxconn 4096
    daemon
    nbproc 4

defaults
    log 127.0.0.1 local3
    mode http
    option dontlognull
    option redispatch
    retries 2
    maxconn 2000
    balance roundrobin
    timeout connect 5000ms
    timeout client 5000ms
    timeout server 5000ms

frontend main
    bind *:6301
    default_backend webserver

backend webserver
    server ngxin_master 172.20.128.4:80 check inter 2000 rise 2 fall 5

最后,撰写服务的shell脚本entrypoint.sh

#!/bin/sh

/usr/sbin/keepalived -n -l -D -f /etc/keepalived/keepalived.conf --dont-fork --log-console &

nginx -g "daemon off;"

整个项目结构如下:

现在我们来启动容器集群,输入命令:docker-compose up

发现容器已经启动

另外一个命令行,输入:docker ps

可以看到,后台分别三个容器正在启动,两台nginx反向代理8000端口的后台服务,访问 localhost:8000

现在我们来模仿一下nginx主机宕机的情况

docker pause nginx_keepalive_nginx_master_1

再次访问 localhost:8000

发现已经自动无缝切换到备用机,整个过程非常流畅

高可用架构的特性就体现在这里,所以在面试中,对于面试官提出的问题要不断的总结,对于不熟悉不知道的问题,一定要深入研究一下,这样才可以在面试中无往而不胜。

最后附上项目地址:https://gitee.com/QiHanXiBei/nginx_keepalive

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 第一步:安装DockerDocker Compose;第二步:创建一个目录,用于存放docker-compose.yml文件;第三步:在该目录中创建一个docker-compose.yml文件,并编写nginx容器的配置;第四步:在该目录下使用docker-compose up命令,启动nginx容器;第五步:使用docker ps查看容器的运行状态。 ### 回答2: 利用docker-compose搭建Nginx容器的步骤如下: 1. 首先,确保已经安装了Dockerdocker-compose。如果没有安装,可以根据自己的操作系统类型,在官方网站下载并按照指引进行安装。 2. 创建一个项目目录,并在此目录下创建一个docker-compose.yml文件。 3. 在docker-compose.yml中定义Nginx容器的配置信息。可以使用下面的示例作为起始点: ```yaml version: '3' services: nginx: image: nginx ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./www:/usr/share/nginx/html restart: always ``` 上述配置中,我们使用了官方的Nginx镜像,并映射了本地的nginx.conf文件和www目录到容器内对应的路径。通过端口映射,将主机的80端口映射到容器的80端口。 4. 在同级目录下创建nginx.conf文件,并在其中定义Nginx的配置信息。可以根据自己的需要进行配置。例如,可以添加一些代理规则或者设置默认访问页面。确保将此文件与docker-compose.yml中的映射路径对应。 5. 在同级目录下创建www目录,并将要发布的静态文件或网站放入其中。 6. 打开命令行或终端,进入到项目目录。 7. 运行以下命令启动Nginx容器: ``` docker-compose up -d ``` 这将会启动容器,并在后台运行。 8. 完成后,可以通过浏览器访问http://localhost来查看Nginx是否已经成功运行。如果一切正常,将会显示Nginx的默认欢迎页面。 通过以上步骤,我们成功地利用docker-compose搭建了一个Nginx容器。在实际使用中,可以根据自己的需求进一步定制配置,并且可以在docker-compose.yml中添加其他服务容器,以构建更复杂的应用程序环境。 ### 回答3: 搭建Nginx容器可以使用Docker Compose来简化操作,以下是利用Docker Compose搭建Nginx容器的步骤: 1. 首先,在安装了DockerDocker Compose的机器上创建一个项目目录,用于存放相关的配置文件。 2. 在项目目录中创建一个`docker-compose.yml`文件,用于定义容器的配置。在`docker-compose.yml`文件中,可以指定Nginx容器的镜像、端口映射、环境变量等。 3. 编辑`docker-compose.yml`文件,添加以下内容: ``` version: '3' services: nginx: image: nginx ports: - 80:80 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./html:/usr/share/nginx/html restart: always ``` 上述配置定义了一个名为`nginx`的服务,使用Nginx官方提供的镜像,将容器的80端口映射到主机的80端口上,同时将`nginx.conf`文件和`html`目录分别映射到容器内的`/etc/nginx/nginx.conf`和`/usr/share/nginx/html`路径。 4. 在项目目录中创建一个`nginx.conf`文件,用于配置Nginx的相关设置,例如监听端口、代理等。根据需要编辑该文件。 5. 在项目目录中创建一个`html`目录,用于存放Nginx的静态文件和网页等内容。根据需要添加相应的文件。 6. 打开命令行或终端,切换到项目目录,执行以下命令启动容器: ``` docker-compose up -d ``` 该命令会根据`docker-compose.yml`文件中的配置创建和启动Nginx容器。`-d`参数表示以守护态(后台)运行。 7. 等待一段时间后,Nginx容器就会启动成功。可以通过浏览器访问`http://localhost`来验证Nginx是否正常工作。若成功显示Nginx的欢迎页面,则说明搭建成功。 通过以上步骤,利用Docker Compose搭建Nginx容器的过程就完成了。可以根据需要编辑`docker-compose.yml`文件和相关配置文件,来定制化Nginx容器的功能和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘悦的技术分享

承您打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值