nginx配置负载均衡详解

在现代的 web 应用中,负载均衡是确保高可用性、可扩展性和稳定性的关键技术之一。Nginx 是一个非常流行的反向代理服务器和负载均衡器,它支持多种负载均衡策略,能够帮助将客户端的请求分发到多个后端服务器,以提高系统的整体性能和可靠性。

dokcer 镜像下载:Nginx1.27.1.tar

1. Nginx 负载均衡基本概念

负载均衡(Load Balancing)指的是通过分配客户端请求到多个服务器(也称为后端服务器或上游服务器),从而平衡各个服务器的负载。Nginx 支持以下几种负载均衡方法:

  • 轮询(Round Robin):请求按顺序分发到所有后端服务器。
  • 最少连接(Least Connections):请求分发到当前连接数最少的服务器。
  • IP 哈希(IP Hash):根据客户端 IP 地址的 hash 值决定将请求发送到哪台服务器。

2. 配置 Nginx 负载均衡

2.1 基本负载均衡配置

在 Nginx 中配置负载均衡,通常需要配置一个 upstream 块来定义一组后端服务器,并在 server 块中将请求转发到这些服务器。

步骤 1: 修改 nginx.conf 文件来配置负载均衡。

http {upstream backend {# 服务器地址和端口server backend1.example.com;server backend2.example.com;server backend3.example.com;# 负载均衡策略# default is round robin (轮询)# server backend4.example.com;}server {listen 80;location / {proxy_pass http://backend;  # 将请求转发到 upstream 后端服务器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;}}
}
2.2 负载均衡策略
轮询(Round Robin)

这是默认的负载均衡方式,Nginx 会将请求按顺序轮流分发到每个后端服务器。

upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
最少连接(Least Connections)

使用最少连接策略时,Nginx 会将请求转发给当前连接数最少的后端服务器,这在负载不均匀时特别有用。

upstream backend {least_conn;  # 使用最少连接策略server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

IP 哈希(IP Hash)

通过使用 IP 哈希策略,Nginx 会根据客户端的 IP 地址来决定请求转发到哪台服务器。这可以确保同一客户端的请求始终转发到相同的服务器,从而避免会话问题。

 
upstream backend {ip_hash;  # 使用 IP 哈希server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
2.3 设置权重

你可以为每个后端服务器设置不同的权重,这样就能控制请求的分发比例。例如,你可以给某台性能较强的服务器设置更高的权重,确保它处理更多的请求。

upstream backend {server backend1.example.com weight=3;  # 权重 3server backend2.example.com weight=2;  # 权重 2server backend3.example.com weight=1;  # 权重 1
}

在这个例子中,backend1.example.com 会处理 3 倍于 backend3.example.com 的请求。

2.4 健康检查

Nginx 通过 fail_timeoutmax_fails 配置来控制服务器的健康检查。当后端服务器在一定时间内失败的次数超过 max_fails 配置时,Nginx 会将其从负载均衡池中暂时移除,避免发送请求到故障的服务器。

upstream backend {server backend1.example.com max_fails=3 fail_timeout=30s;server backend2.example.com max_fails=3 fail_timeout=30s;server backend3.example.com max_fails=3 fail_timeout=30s;
}
  • max_fails:指定服务器在 fail_timeout 时间内允许的最大失败次数。
  • fail_timeout:指定服务器在多长时间内无法正常响应时被认为是失败的。
2.5 配置负载均衡的重定向(代理请求头)

通常我们会希望把客户端的 IP 地址、原始主机名等信息传递到后端服务器,避免请求丢失这些信息。Nginx 提供了多种方法来设置请求头,常见的做法是设置 X-Real-IPX-Forwarded-For

location / {proxy_pass http://backend;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;
}

3. 高级负载均衡配置

3.1 负载均衡与缓存

Nginx 可以与缓存机制结合使用,以提高负载均衡的效率。可以使用 proxy_cache 来缓存从后端服务器获取的响应,这有助于减轻后端的负担,提高处理请求的速度。

http {proxy_cache_path /tmp/cache keys_zone=my_cache:10m;upstream backend {server backend1.example.com;server backend2.example.com;}server {location / {proxy_cache my_cache;proxy_pass http://backend;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_cache 用来缓存来自后端服务器的响应。

3.2 使用 SSL 进行加密

如果后端服务需要加密通信,可以通过 SSL 配置进行保护。你可以在 Nginx 中为 upstream 配置 SSL。

upstream backend {server backend1.example.com:443 ssl;server backend2.example.com:443 ssl;
}server {listen 443 ssl;server_name www.example.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/cert.key;location / {proxy_pass https://backend;}
}
3.3 动态添加后端服务器

在某些场景下,你可能希望能够动态地添加或删除后端服务器而不重启 Nginx。这可以通过 nginxnginx -s reload 命令来实现。动态更新可以配合监控和自动化脚本进行。

4. 总结

Nginx 配置负载均衡的基本步骤是:

  1. 使用 upstream 定义后端服务器集群。
  2. 配置负载均衡算法:轮询、最少连接或 IP 哈希。
  3. 配置健康检查机制,确保故障服务器不会接收到流量。
  4. 配置代理请求头,转发原始客户端信息到后端服务器。

负载均衡不仅能提高网站的可用性和扩展性,还能帮助减轻单台服务器的负载。在高可用性和高流量场景下,Nginx 是一个强大的负载均衡解决方案。

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

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

相关文章

AutoSAR CP DoIP规范导读

主要功能和用途 诊断通信协议实现 遵循标准:遵循ISO 13400 - 2标准,实现了诊断通信在IP网络上的传输协议和网络层服务,包括数据封装、传输、路由等功能。 多种消息支持 车辆识别与公告:能够进行车辆识别请求和响应,…

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题,记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…

屏幕缩放后截屏图片尺寸数字偏大导致前端DOM尺寸设置失真问题

如果显示器的尺寸缩放,而不是100%的话,利用截屏软件截取屏幕中的区域,截取时读取到的区域尺寸,就会失真;如果使用这个尺寸去设置网页中的DOM,则Dom的尺寸也会跟着失真。 比如, 如果使用失真…

蓝桥杯每日真题 - 第7天

题目:(爬山) 题目描述(X届 C&C B组X题) 解题思路: 前缀和构造:为了高效地计算子数组的和,我们可以先构造前缀和数组 a,其中 a[i] 表示从第 1 个元素到第 i 个元素的…

给阿里云OSS绑定域名并启用SSL

为什么要这么做? 问题描述: 当用户通过 OSS 域名访问文件时,OSS 会在响应头中增加 Content-Disposition: attachment 和 x-oss-force-download: true,导致文件被强制下载而不是预览。这个问题特别影响在 2022/10/09 之后新开通 OS…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候,使用浏览器是经常的,很多用户在点开浏览器时,却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢?今天小编就给大家分享几个常见的原因和具体的解决方法,希望能对大家有所帮…

(干货)Jenkins使用kubernetes插件连接k8s的认证方式

#Kubernetes插件简介 Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时,Jenkins Master 会在 kubernetes 中创建一个 Sla…

C语言 | Leetcode C语言题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; int nextGreaterElement(int n){int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 % 10 < targetDigit; x2…

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统&#xff0c;旨在提供一致的设计语言和视觉…

计算机网络(11)和流量控制补充

这一篇对数据链路层中的和流量控制进行详细学习 流量控制&#xff08;Flow Control&#xff09;是计算机网络中确保数据流平稳传输的技术&#xff0c;旨在防止数据发送方发送过多数据&#xff0c;导致接收方的缓冲区溢出&#xff0c;进而造成数据丢失或传输失败。流量控制通常…

可扩展架构与分层架构

可扩展架构 1 概述 软件系统与硬件/建筑系统最大的区别就是可以迭代升级和扩展&#xff0c;一个硬件生产出来后就不会进行改变&#xff0c;除非拿去售后维修&#xff0c;一个建筑完工后也不会改变其整体的结构&#xff0c;除非被破坏后进行修复和重铸 可以发现如果硬件/建筑不…

MyBatis从入门到进阶

目录 MyBatis入门1、创建项目、数据准备2、数据库配置3、编写持久层代码单元测试打印日志 基本操作查询数据插入数据删除数据更新数据 MyBatis - xml插入数据更新数据删除数据查询数据#{}与${}SQL注入排序like查询 MyBatis进阶if标签trim标签where标签set标签foreach标签sql标签…

TensorFlow 2.0 环境配置

官方文档&#xff1a;CUDA Installation Guide for Windows 官方文档有坑&#xff0c;windows的安装指南直接复制了linux的指南内容&#xff1a;忽略这些离谱的信息即可。 可以从官方文档知悉&#xff0c;cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…

浅谈:基于三维场景的视频融合方法

视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 &#xff0c; 现实的漫游效果不是从摄像机的角度来看 &#xff0c; 但其仍然存在很多困难 。基于三维场景的视频融合 &#xff0c; 因其直观等特效在视频监控等相关领域有着…

亚马逊评论爬虫+数据分析

爬取评论 做分析首先得有数据&#xff0c;数据是核心&#xff0c;而且要准确&#xff01; 1、爬虫必要步骤&#xff0c;选好框架 2、开发所需数据 3、最后测试流程 这里我所选框架是seleniumrequest&#xff0c;很多人觉得selenium慢&#xff0c;确实不快&#xff0c;仅针对此…

RK3588 C++ 多线程运行

RK3588 C 多线程 实际运行解决OpenCV问题&#xff1a; 1. OpenCV 安装 sudo apt-get update sudo apt-get install libopencv-dev2. 检查 OpenCV 安装路径 find / -name OpenCVConfig.cmake3. 设置 OpenCV_DIR 环境变量 export OpenCV_DIR/usr/lib/aarch64-linux-gnu/cmake/op…

【已解决】Parameter index out of range (14 > number of parameters, which is 13).

解决思路&#xff1a; 字面意思就是sql传参数量对不上&#xff0c;但我检查几遍代码都感觉没问题&#xff0c;sql单独拿到mysql里运行也没问题。看了其他的报错&#xff1a;Error setting non null for parameter #2 with JdbcType null&#xff0c;看起来也是跟参数有关的&am…

MDBook 使用指南

MDBook 是一个灵感来自 Gitbook 的强大工具&#xff0c;专门用于创建电子书和文档。它能够将 Markdown 编写的内容编译成静态网站&#xff0c;非常适合项目文档、教程和书籍的发布。 个人实践过许多文档方案&#xff0c;如 hexo、hugo、WordPress、docsify 和 mdbook 等&#…

vue计算属性 初步使用案例

<template><div><h1>购物车</h1><div v-for"item in filteredItems" :key"item.id"><p>{{ item.name }} - {{ item.price }} 元</p><input type"number" v-model.number"item.quantity"…

C++编程技巧与规范-类和对象

类和对象 1. 静态对象的探讨与全局对象的构造顺序 静态对象的探讨 类中的静态成员变量(类类型静态成员) 类中静态变量的声明与定义&#xff08;类中声明类外定义&#xff09; #include<iostream> using namespace std;namespace _nmspl {class A{public:A():m_i(5){…