Docker Nginx 负载均衡搭建(服务宕机-配置高可用) - 附(Python案例,其它语言同理)

目录

一 . 概要

1. 什么是负载均衡

2. 负载均衡有哪些优势?

(1)应用程序可用性

(2)应用程序可扩展性

(3)应用程序安全

(4)应用程序性能

3 . Nginx负载均衡调度策略

二 . 搭建案例

1. 创建项目目录

2. 创建三个py文件,启动三个服务

3. 编写 Nginx.conf

4. 编写 Dockerfile

三 . 镜像打包运行

四 . 个人小结


一 . 概要

1. 什么是负载均衡

负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法。现代应用程序必须同时处理数百万用户,并以快速、可靠的方式将正确的文本、视频、图像和其他数据返回给每个用户。为了处理如此高的流量,大多数应用程序都有许多资源服务器,它们之间包含很多重复数据。负载均衡器是位于用户与服务器组之间的设备,充当不可见的协调者,确保均等使用所有资源服务器。

2. 负载均衡有哪些优势?

目的:提升吞吐率, 提升请求性能, 提⾼高容灾

负载均衡可以定向和控制应用程序服务器与其访客或客户端之间的互联网流量。因此,它可提高应用程序的可用性、可扩展性、安全性和性能。

(1)应用程序可用性

服务器故障或维护可能会增加应用程序停机时间,使访客无法访问您的应用程序。负载均衡器可以通过以下方式提高您的系统的容错能力:自动检测服务器问题并将客户端流量重定向到可用服务器。您可以使用负载均衡来简化以下任务:

  • 运行应用程序服务器维护或升级而无需使应用程序停机
  • 为备份站点提供自动灾难恢复
  • 执行运行状况检查并防止出现可能导致停机的问题

(2)应用程序可扩展性

您可以使用负载均衡器在多个服务器之间智能地定向网络流量。您的应用程序可以处理数千个客户端请求,因为负载均衡会执行以下操作:

  • 防止任何一台服务器出现流量瓶颈
  • 预测应用程序流量,以便您可以在需要时添加或移除不同服务器
  • 为您的系统增加冗余度,使您可以放心扩展

(3)应用程序安全

负载均衡器具有多项内置的安全功能,可为您的互联网应用程序的安全保驾护航。它们是应对分布式拒绝服务攻击的有用工具,在这种攻击中,攻击者会用数百万个并发请求淹没应用程序服务器,从而导致服务器故障。负载均衡器还可以执行以下操作:

  • 监控流量并阻止恶意内容
  • 将攻击流量自动重定向到多个后端服务器,以最大限度减少影响
  • 通过一组网络防火墙路由流量,以提高安全性

(4)应用程序性能

负载均衡器通过增加响应时间和减少网络延迟来提高应用程序性能。它们可以执行诸如以下几项关键任务:

  • 在服务器之间平均分配负载以提高应用程序性能
  • 将客户端请求重定向到地理位置较近的服务器以减少延迟
  • 确保物理和虚拟计算资源的可靠性和性能

3 . Nginx负载均衡调度策略

调度算法概述
轮询逐一轮询,默认方式
weight加权轮询,weight越大,分配的几率越高
ip_hash按照访问IP的hash结果分配,会导致来自同一IP的请求访问固定的一个后台服务器
fair按后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash按照访问URL的hash结果分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。upstream backserver {server 192.168.0.14;server 192.168.0.15;
}
2、权重 weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。upstream backserver {server 192.168.0.14 weight=3;server 192.168.0.15 weight=7;
}
3、ip_hash( IP绑定)
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。upstream backserver {ip_hash;server 192.168.0.14:88;server 192.168.0.15:80;
}
4、fair(第三方插件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。upstream backserver {server server1;server server2;fair;
}
5、url_hash(第三方插件)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。upstream backserver {server squid1:3128;server squid2:3128;hash $request_uri;hash_method crc32;
}

二 . 搭建案例

1. 创建项目目录

mkdir disaster_recovery

2. 创建三个py文件,启动三个服务

main1.py ,main2.py,main3.py  端口号分别为 4000,4001,4002

from flask_cors import CORS
from flask import Response, jsonify, Flask, request# 建立flask实例
app = Flask(__name__)
# 注册CORS, "/*" 允许访问所有api
CORS(app, resources=r'/*')# 获取 Flask 应用的根路径
root_path = app.root_path# 解决中文乱码
app.config['JSON_AS_ASCII'] = False@app.route('/', methods=['GET', 'POST', 'DELETE', 'PUT', 'CATCH'])
def Start():print('启动成功!')return jsonify({'code': 200,'msg':'测试'})@app.route('/start1', methods=['GET', 'POST', 'DELETE', 'PUT', 'CATCH'])
def Start1():print('启动成功Start1!')return jsonify({'code': 200,'msg':'测试'})# 调用实例对象
if __name__ == '__main__':app.run(debug=True,host='0.0.0.0', port=4000)

3. 编写 Nginx.conf

这里Nginx监听80端口,反向代理到本地系统(也可以使用其他服务器ip及端口)的4000,4001,4002端口

这里我们使用负载均衡方案:权重,如果有其他需求,可以按照其他的方案进行修改:

events {worker_connections 1024;
}http {upstream servers_list {server 192.168.14.93:4000 weight=3;server 192.168.14.93:4001 weight=5;server 192.168.14.93:4002 weight=2;}server {listen 80;location / {proxy_pass http://servers_list;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 服务宕机-配置proxy_connect_timeout 1;}}
}# worker_connections,单个工作进程可以允许同时建立外部连接的数量  数字越大,能同时处理的连接越多
# 1.默认:worker_connections: 1024
# 2.调大:worker_connections: 100000,(调大到10万连接)
# upstream servers_list { ... }: 定义了一个名为backend的上游服务器组,包含了要负载均衡的后端服务器列表。
# server { ... }: 定义了一个NGINX服务器块。
# listen 80;: 监听80端口。
# location / { ... }: 定义了一个用于处理所有请求的位置块。
# proxy_pass http://servers_list;: 将请求转发到名为backend的上游服务器组中定义的服务器上,实现负载均衡。
# proxy_set_header: 设置HTTP请求头,确保后端服务器能够获取到客户端的真实IP等信息。
# 在这个配置中,NGINX会将来自客户端的请求负载均衡地转发到backend1.example.com、backend2.example.com和backend3.example.com中的一个。

 proxy_connect_timeout 1;

nginx提供了宕机容错机制,当一个后端服务器由于服务器故障、网络问题等原因不能提供服务时, nginx可以通过配置超时,超过超时时间以后,则跳过当前服务器,请求下一台服务器
在nginx.conf文件中 配置 proxy_connect_timeout 1  连接超过1s 则跳过当前轮询

4. 编写 Dockerfile

FROM yankovg/python3.8.2-ubuntu18.04# 设置时区为中国标准时间
ENV TZ=Asia/Shanghai# 安装NGINX
RUN apt-get update && apt-get install -y nginx# 配置NGINX
COPY nginx.conf /etc/nginx/nginx.conf# 暴露端口
EXPOSE 80# 启动NGINX
CMD ["nginx", "-g", "daemon off;"]

这里基础镜像选择预装了Python3.8的Ubuntu18,兼具了小体积和可扩展的特性,添加apt-get的安装源后,安装Nginx。

最后,将nginx.conf拷贝到对应的配置路径中,启动Nginx服务。

三 . 镜像打包运行

在项目根目录的终端内运行命令打包镜像:

docker build -t . disaster_recovery_task

 首次编译等待小会,进行下载

[+] Building 0.5s (8/8) FINISHED                                                                         docker:default=> [internal] load .dockerignore                                                                                  0.0s=> => transferring context: 2B                                                                                    0.0s=> [internal] load build definition from Dockerfile                                                               0.0s=> => transferring dockerfile: 1.25kB                                                                             0.0s=> [internal] load metadata for docker.io/yankovg/python3.8.2-ubuntu18.04:latest                                  0.5s=> [1/3] FROM docker.io/yankovg/python3.8.2-ubuntu18.04@sha256:811ad1ba536c1bd2854a42b5d6655fa9609dce1370a6b6d48  0.0s=> [internal] load build context                                                                                  0.0s=> => transferring context: 1.58kB                                                                                0.0s=> CACHED [2/3] RUN apt-get update && apt-get install -y nginx                                                    0.0s=> [3/3] COPY nginx.conf /etc/nginx/nginx.conf                                                                    0.0s=> exporting to image                                                                                             0.0s=> => exporting layers                                                                                            0.0s=> => writing image sha256:72c9a8f86c0c14d77a51d5542b7877c2d5e8b12c72a12a4b7708f7e15263ed05                       0.0s=> => naming to docker.io/library/disaster_recovery_task                                                          0.0sWhat's Next?View summary of image vulnerabilities and recommendations → docker scout quickview

 打包成功后,运行命令查看镜像信息:

docker images

 可以看到镜像总大小不到1g:

REPOSITORY                          TAG              IMAGE ID       CREATED              SIZE
disaster_recovery_task              latest           72c9a8f86c0c   About a minute ago   784MB

 接着让我们来启动容器

docker run  -d  -p 81:80 --name disaster_recovery_task  disaster_recovery_task

 显示正在运行

CONTAINER ID   IMAGE                         COMMAND                   CREATED          STATUS          PORTSNAMES
2925cdd6a0f8   disaster_recovery_task        "nginx -g 'daemon of…"   33 seconds ago   Up 32 seconds   0.0.0.0:81->80/tcp       disaster_recovery_task

此时我们打开浏览器访问 http://127.0.0.1:81

  • 访问五次结果 
端口次数
40002
40012
40021

四 . 个人小结

nginx负载均衡是提高网站性能和可靠性的重要手段之一,合理配置和管理可以有效地提升网站的运行效率和用户体验,大家也可以尝试使用监控软件来对nginx以及服务进行宕机拉起

诚然,在我们程序开发中,大部分时间都是在书写代码,思考逻辑与数据清洗处理,但也要多了解其他东西,动手操作,增加自己的见识与理解,漫漫长路,学海无涯~(实践知真知)加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

核密度分析

一.算法介绍 核密度估计(Kernel Density Estimation)是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用,包括: 数据可视化:核密度估计可以用来绘制平滑的密度曲线或热力图,从而直观地表…

win系统下安装php8.3版本并配置环境变量的详细教程

本篇文章主要讲解在win系统下安装和配置php8.3版本,并配置环境变量的详细教程。 日期:2024年2月22日 作者:任聪聪 一、下载php8.3版本包 php8.3版本官方下载地址:https://windows.php.net/download#php-8.3 步骤一、打开下载地址…

【Unity】Unity与安卓交互

问题描述 Unity和安卓手机进行交互,是我们开发游戏中最常见的场景。本教程将从一个简单的例子来演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一个工程 2.选择Empty Activity 然后点击Next 3.点击Finish完成创建 4.选择File-New-New Mo…

【python 3.9.18】windowns安装版

因为这个版本官方未提供,所以需要自己编译出来,其他没有的版本可以依据下面的进行生成一个exe也可行。 成品: https://gitee.com/greatLong/python-3.9.18/tree/master/python-3.9.18/PCbuild/amd64 1、环境准备 需要使用到 这里面还需要选…

【MATLAB GUI】 5. 图像处理菜单(菜单编辑器)

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 任务要求设计一个图像处理菜单,实现图像的打开导入、灰度处理、存储等功能 修改过文件名,所以运行的时候会有一点点报错,但是不影响运行 打开工具栏下边的菜单编辑器…

创建一个基于Node.js的实时聊天应用

在当今数字化社会,实时通讯已成为人们生活中不可或缺的一部分。无论是在社交媒体平台上与朋友交流,还是在工作场合中与同事协作,实时聊天应用都扮演着重要角色。与此同时,Node.js作为一种流行的后端技术,为开发者提供了…

CrossOver虚拟机软件2024有哪些功能?最新版本支持哪些游戏?

CrossOver由codewaver公司开发的类虚拟机软件,目的是使linux和Mac OS X操作系统和window系统兼容。CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏,而不…

LangChain支持哔哩哔哩视频总结

是基于LangChain框架下的开发,所以最开始请先 pip install Langchain pip install bilibili-api-python 技术要点: 使用Langchain框架自带的Document loaders 修改BiliBiliLoader的源码,自带的并不支持当前b站的视频加载 源码文件修改&a…

【高德地图】Android高德地图绘制标记点Marker

📖第4章 Android高德地图绘制标记点Marker ✅绘制默认 Marker✅绘制多个Marker✅绘制自定义 Marker✅Marker点击事件✅Marker动画效果✅Marker拖拽事件✅绘制默认 Infowindow🚩隐藏InfoWindow 弹框 ✅绘制自定义 InfoWindow🚩实现 InfoWindow…

ArcgisForJS如何实现添加含图片样式的点要素?

文章目录 0.引言1.加载底图2.获取点要素的坐标3.添加含图片样式的几何要素4.完整实现 0.引言 ArcGIS API for JavaScript 是一个用于在Web和移动应用程序中创建交互式地图和地理空间分析应用的库。本文在ArcGIS For JavaScript中使用Graphic对象来创建包含图片样式的点要素。 …

MIT-6.824-Lab2,Raft部分笔记|Use Go

文章目录 前记Paper6:RaftLEC5、6:RaftLAB22AtaskHintlockingstructureguide设计与编码 2BtaskHint设计与编码 2CtaskHint question后记 LEC5:GO, Threads, and Raftgo threads技巧raft实验易错点debug技巧 前记 趁着研一考完期末有点点空余…

软考29-上午题-【数据结构】-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后,次序不变,则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

微信小程序 --- wx.request网络请求封装

网络请求封装 网络请求模块难度较大,如果学习起来感觉吃力,可以直接学习 [请求封装-使用 npm 包发送请求] 以后的模块 01. 为什么要封装 wx.request 小程序大多数 API 都是异步 API,如 wx.request(),wx.login() 等。这类 API 接口…

【精选】Java面向对象进阶——内部类

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

【操作系统】磁盘文件管理系统

实验六 磁盘文件管理的模拟实现 实验目的 文件系统是操作系统中用来存储和管理信息的机构,具有按名存取的功能,不仅能方便用户对信息的使用,也有效提高了信息的安全性。本实验模拟文件系统的目录结构,并在此基础上实现文件的各种…

FISCO BCOS(十七)利用脚本进行区块链系统监控

要利用脚本进行区块链系统监控,你可以使用各种编程语言编写脚本,如Python、Shell等 利用脚本进行区块链系统监控可以提高系统的稳定性、可靠性,并帮助及时发现和解决潜在问题,从而确保区块链网络的正常运行。本文可以利用脚本来解…

Vue3 使用动态组件 component

component 标签&#xff1a;用于动态渲染标签或组件。 语法格式&#xff1a; <component is"标签或组件名">标签内容</component> 动态渲染标签&#xff1a; <template><h3>我是父组件</h3><component is"h1">动态…

SpringCloud(15)之SpringCloud Gateway

一、Spring Cloud Gateway介绍 Spring Cloud Gateway 是Spring Cloud团队的一个全新项目&#xff0c;基于Spring 5.0、SpringBoot2.0、 Project Reactor 等技术开发的网关。旨在为微服务架构提供一种简单有效统一的API路由管理方式。 Spring Cloud Gateway 作为SpringCloud生态…

【Unity】MySql +Navicat 安装教程

问题描述 在使用Unity开发的时候&#xff0c;有的时候我们是需要使用Mysql数据库的&#xff0c;本教程使用的MySql 和Navicat均为免安装版 ❶mysql安装 1.下载mysql解压至任意目录&#xff0c;此处以“C:\mysql-5.6.39-winx64”为例. mysql百度云连接&#xff1a; 链接&…

Java的递归【详解】

1.认识递归基础知识 什么是方法递归&#xff1f; 递归是一种算法&#xff0c;在程序设计语言中广泛应用。 从形式上说&#xff1a;方法调用自身的形式称为方法递归&#xff08; recursion&#xff09;。 递归的形式&#xff1a; 直接递归&#xff1a;方法自己调用自己。 间接递…