【Nginx】负载均衡配置详解
Nginx作为高性能的HTTP服务器和反向代理服务器,提供了强大的负载均衡功能。本文将详细介绍Nginx负载均衡的配置方法和相关策略。
一、基础负载均衡配置
1.单服务示例配置
配置nginx.conf
模块
在Nginx配置文件中定义upstream模块:
worker_processes auto;events {worker_connections 1024;
}http{upstream backend {server 192.168.1.101:8080;server 192.168.1.102:8080;server 192.168.1.103:8080;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}
2.多服务配置
worker_processes auto;events {worker_connections 1024;
}http{# 定义一个新的日志格式,包含 upstream_addrlog_format custom '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" ''upstream: $upstream_addr';upstream server1{server 192.168.211.5:9529;server 192.168.211.169:9529;}upstream server2{server 192.168.211.5:9528;server 192.168.211.169:9528;}server {listen 80;server_name localhost;# 使用自定义的日志格式access_log /opt/nginx/logs/access.log custom;location ~ ^/server1/(.*)$ {proxy_pass http://server1/$1;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 Content-Type application/json;}location ~ ^/server2/(.*)$ {proxy_pass http://server2/$1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location ~* \.(css|js|html)$ {root /opt/nginx/html; # 在本例中的绝对路径为 /usr/local/nginx/html}error_page 404 /404.html;error_page 500 502 503 504 /50x.html;}
}
3.docker启动nginx脚本
该脚本需要根据自己的docker镜像启动nginx的配置去修改
#!/bin/bash# 定义变量
CONTAINER_NAME="nlb-nginx"
IMAGE_NAME="nginx:1.26"
HOST_PORT="9090" # 主机端口
CONTAINER_PORT="80" # 容器端口
PORT_MAPPING="${HOST_PORT}:${CONTAINER_PORT}"
NGINX_CONF_PATH="$(pwd)/nginx_server/nginx.conf"
LOG_DIR="/var/server1/logs/proxy"
TEST_URL="http://localhost:${HOST_PORT}"# 确保日志目录存在
if [ ! -d "$LOG_DIR" ]; thenecho "Creating log directory: $LOG_DIR"mkdir -p "$LOG_DIR" || {echo "Failed to create log directory."exit 1}
fi# 停止并删除旧容器(如果存在)
echo "Stopping and removing existing container: $CONTAINER_NAME"
docker stop "$CONTAINER_NAME" > /dev/null 2>&1
docker rm -f "$CONTAINER_NAME" > /dev/null 2>&1# 启动新的 Nginx 容器
echo "Starting new Nginx container: $CONTAINER_NAME"
docker run -itd \--name "$CONTAINER_NAME" \-p "$PORT_MAPPING" \-v "$NGINX_CONF_PATH:/opt/nginx/etc/nginx.conf" \-v "$LOG_DIR:/opt/nginx/logs" \"$IMAGE_NAME" \/opt/nginx/sbin/nginx -c /opt/nginx/etc/nginx.conf -g "daemon off;" || {echo "Failed to start container $CONTAINER_NAME."exit 1
}# 验证容器状态
echo "Verifying container status..."
if docker ps -f name="$CONTAINER_NAME" | grep -q "$CONTAINER_NAME"; thenecho "Container $CONTAINER_NAME is running successfully."
elseecho "Container $CONTAINER_NAME failed to start."exit 1
fi# 测试访问
echo "Testing access to $TEST_URL..."
if curl -s -o /dev/null -w "%{http_code}" "$TEST_URL" | grep -q "200"; thenecho "Nginx is accessible at $TEST_URL"
elseecho "Failed to access Nginx at $TEST_URL"exit 1
fiecho "Deployment completed successfully!"
4.测试负载均衡-脚本
1.后端服务
示例:使用 Python Flask 实现
在每台后端服务器上运行以下简单的 Flask 应用程序:
后端服务器 1 (192.168.211.5):
from flask import Flaskapp = Flask(__name__)@app.route('/nginx_test')
def server_info():return "192.168.211.5"if __name__ == '__main__':app.run(host='0.0.0.0', port=9529)
后端服务器 2 (192.168.211.75):
from flask import Flaskapp = Flask(__name__)@app.route('/nginx_test')
def server_info():return "192.168.211.75"if __name__ == '__main__':app.run(host='0.0.0.0', port=9529)
2.前端html测试
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Test Nginx Smartlabel</title>
</head>
<body><h1>Nginx and Flask Test Page</h1><p>Server Response: <strong id="server-response">Loading...</strong></p><script>// JavaScript to send a GET request to the Flask endpointfetch('/server1/nginx_test', {method: 'GET'}).then(response => response.json()) // Parse the JSON response.then(data => {document.getElementById('server-response').innerText = JSON.stringify(data);}).catch(error => {document.getElementById('server-response').innerText = 'Error fetching data';});</script>
</body>
</html>
- 访问测试页面
打开浏览器并访问 http://localhost:9090/test.html。页面会显示类似以下内容:
Nginx and Flask Test Page
Server Response: {"ip_info":"192.168.211.236","server":"server1"}
二、负载均衡策略
Nginx支持多种负载均衡算法:
- 轮询(默认)
upstream backend {server 192.168.1.101;server 192.168.1.102;
}
- 加权轮询
upstream backend {server 192.168.1.101 weight=3;server 192.168.1.102 weight=1;
}
- IP哈希(保持会话)
upstream backend {ip_hash;server 192.168.1.101;server 192.168.1.102;
}
- 最少连接数
upstream backend {least_conn;server 192.168.1.101;server 192.168.1.102;
}
- 基于响应时间(商业版)
upstream backend {fair;server 192.168.1.101;server 192.168.1.102;
}
三、高级配置选项
- 服务器状态参数
upstream backend {server 192.168.1.101 max_fails=3 fail_timeout=30s;server 192.168.1.102 backup;server 192.168.1.103 down;
}
- max_fails: 最大失败次数
- fail_timeout: 失败超时时间
- backup: 备用服务器
- down: 标记服务器不可用
- 健康检查(商业版)
upstream backend {zone backend 64k;server 192.168.1.101;server 192.168.1.102;health_check interval=5s fails=3 passes=2 uri=/health;
}
四、TCP/UDP负载均衡
Nginx也可以用于TCP/UDP负载均衡:
stream {upstream tcp_backend {server 192.168.1.101:3306;server 192.168.1.102:3306;}server {listen 3306;proxy_pass tcp_backend;}
}
五、最佳实践
- 会话保持:对于需要会话的应用,使用ip_hash或sticky模块
- 健康检查:配置合理的健康检查参数
- 日志记录:记录后端服务器的响应时间和状态
- 超时设置:适当调整proxy连接超时时间
- 缓冲区优化:根据应用特点调整缓冲区大小
六、常见问题
- 502错误:检查后端服务器是否可用
- 负载不均:调整权重或更换算法
- 性能问题:优化worker_processes和worker_connections
七、总结
通过合理配置Nginx负载均衡,可以显著提高系统的可用性和性能。根据实际业务需求选择合适的负载均衡策略和参数配置是关键。
相关文章:
【Nginx】负载均衡配置详解
Nginx作为高性能的HTTP服务器和反向代理服务器,提供了强大的负载均衡功能。本文将详细介绍Nginx负载均衡的配置方法和相关策略。 一、基础负载均衡配置 1.单服务示例配置 配置nginx.conf模块 在Nginx配置文件中定义upstream模块: worker_processes a…...

JVM——垃圾收集策略
GC的基本问题 什么是GC? GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。 为什么要GC? 堆内存是各个线程共享的空间,…...

马克·雷伯特:用算法让机器人飞奔的人
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 马克雷伯特:用算法让机器人飞奔的人 一、天才的起点 在机器人领域,有一个名字如雷贯耳——马克雷伯特(Marc Raibert)。作为波士顿动力公司(Boston…...

信创系统资产清单采集脚本:主机名+IP+MAC 一键生成 CSV
原文链接:信创系统资产清单采集脚本:主机名IPMAC 一键生成 CSV Hello,大家好啊!今天给大家带来一篇在信创终端操作系统上自动批量采集主机名、IP 和 MAC 并导出为 CSV 表格的实战文章!本方案使用 sshpass 和 Bash 脚本…...

SpringBoot获取用户信息常见问题(密码屏蔽、驼峰命名和下划线命名的自动转换)
文章目录 一、不返回password字段二、返回的createTime和updateTime为空原因解决:开启驼峰命名和下划线命名的自动转换 设置返回的日期格式 一、不返回password字段 在字段上面添加JsonIgnore注解即可 JsonIgnore // 在把对象序列化成json字符串时,忽略…...
小刚说C语言刷题—1602总分和平均分
1.题目描述 期末考试成绩出来了,小明同学语文、数学、英语分别考了 x、y、z 分,请编程帮助小明计算一下,他的总分和平均分分别考了多少分? 输入 三个整数 x、y、z 分别代表小明三科考试的成绩。 输出 第 11行有一个整数&…...
C++编译之(5)-cmake/CMakeLists.txt的编译使用教程
C++编译之(5)-cmake/CMakeLists.txt的编译使用教程 上一节,点这里 1、如何查看cmake的配置参数 那么如何查看当前配置的参数呢,我们可以使用-L参数 cmake .. -L # cmake .. -LAH完全使用命令行,则可以通过多次重复使用cmake … -DOPTION1=ON -D OPTION2=ON配置制定选项;并…...

Mac下安装Python3,并配置环境变量设置为默认
下载Python 访问Python官方网站 https://www.python.org/ 首先获得python3安装路径 执行命令: which python3 以我这台电脑为例,路径为:/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 编辑 bash_profile 文件 然后用 vim 打…...

Linux-04-用户管理命令
一、useradd添加新用户: 基本语法: useradd 用户名:添加新用户 useradd -g 组名 用户:添加新用户到某个组二、passwd设置用户密码: 基本语法: passwd 用户名:设置用户名密码 三、id查看用户是否存在: 基本语法: id 用户名 四、su切换用户: 基本语法: su 用户名称:切换用…...

【进阶】--函数栈帧的创建和销毁详解
目录 一.函数栈帧的概念 二.理解函数栈帧能让我们解决什么问题 三.相关寄存器和汇编指令知识点补充 四.函数栈帧的创建和销毁 4.1.调用堆栈 4.2.函数栈帧的创建 4.3 函数栈帧的销毁 一.函数栈帧的概念 --在C语言中,函数栈帧是指在函数调用过程中,…...
Hadoop伪分布式模式搭建全攻略:从环境配置到实战测试
引言 作为大数据生态的基石,Hadoop凭借其高可靠性、扩展性成为分布式计算的首选框架。本文将手把手带你完成Hadoop伪分布式模式部署,通过单节点模拟集群环境,为后续学习MapReduce、YARN等核心组件打下基础 目录 引言 Hadoop 发展历史 1.1 起源(2002–2005) 1.1 安装JDK…...
Transformer:颠覆深度学习的架构革命与技术演进
2017年,谷歌团队在论文《Attention Is All You Need》中提出的Transformer架构,彻底改变了人工智能对序列数据的处理范式。它不仅解决了传统循环神经网络(RNN)的长期依赖和并行化难题,更催生了BERT、GPT等划时代模型&a…...

【一】 基本概念与应用领域【数字图像处理】
考纲 文章目录 1 概念2005甄题【名词解释】2008、2012甄题【名词解释】可考题【简答题】可考题【简答题】 2 应用领域【了解】2.1 伽马射线成像【核医学影像】☆2.2 X射线成像2.3 紫外波段成像2.4 可见光和红外波段成像2.5 微波波段成像2.6 无线电波段成像2.7 电子显微镜成像2…...

NU1680低成本、无固件、高集成度无线充电电源接收器
无线充电 电子产品具有无线充电功能使用会更便利,介绍一款低成本、无固件、高集成度无线充电电源接收器NU1680 原理图和BOM可点绑定资源下载,LC部分电容建议X7R。 Load空载切满载测试 (CC Mode) – 尽量保证电子负载没有过冲 – 电子负载不要从0到满…...
JVM 内存分配策略
引言 在 Java 虚拟机(JVM)中,内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率,而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理&am…...

2025MathorCup数学应用挑战赛B题
目录 模型建立与求解 1.问题一的模型建立与求解 1.1 搬迁补偿模型设计 1.2 住户是否搬迁的应对策略与分析 1.3 定量讨论 2.问题二的模型建立与求解 2.1 搬迁方案模型的优化介绍 2.2 模型的评估 2.3 模型结果 3.问题三的模型建立与求解 3.1 拐点存在性分析模型的建立 3.2 模型的…...

组件的基本知识
组件 组件的基本知识 组件概念组成步骤好处全局注册生命周期scoped原理 父子通信步骤子传父 概念 就是将要复用的标签,抽离放在一个独立的vue文件中,以供主vue文件使用 组成 三部分构成 template:HTML 结构 script: JS 逻辑 style: CSS 样…...

Origin绘图操作:图中迷你图绘制
一、背景描述 Origin绘图时,局部数据变化较小,在整体图片中表现为局部曲线重叠在一起,图中y1和y2在x0-2时重叠在一起,需要将局部放大,绘制迷你图 二、实现方法 1.在左边工具栏选择放大镜,按住ctrl在图中…...

数据升降级:医疗数据的“时空穿梭“系统工程(分析与架构篇)
一、核心挑战与量化分析 1. 版本演化困境的深度解析 (1) 格式断层的结构化危机 数据转换黑洞:某医疗信息平台(2021-2023)统计显示: 数据类型CDA R1→R2转换失败率R2→FHIR转换失败率关键失败点诊断记录28.4%19.7%ICD编码版本冲突(18.7%)用药记录15.2%12.3%剂量单位标准化…...

【GESP】C++三级练习 luogu-B2089 数组逆序重存放
GESP三级练习,一维数组练习(C三级大纲中5号知识点,一维数组),难度★☆☆☆☆。 题目题解详见:https://www.coderli.com/gesp-3-luogu-b2089/ 【GESP】C三级练习 luogu-B2089 数组逆序重存放 | OneCoderGE…...

Copilot 上线深度推理智能体 Researcher
近日,微软推出两款首创的工作场景推理智能体:Researcher(研究员)和Analyst(分析师)。它们能以安全合规的方式访问您的工作数据(包括邮件、会议、文件、聊天记录等)及互联网信息&…...
QDrant数据构造及增删改查
QDrant数据构造及增删改查 一、PointStruct介绍 PointStruct 是一种结构体(或数据类),通常用于表示: 向量数据库中的一个数据点(Vector Point),包括它的 ID、向量值(vector embedd…...

日常开发小Tips:后端返回带颜色的字段给前端
一般来说,展示给用户的字体格式,都是由前端控制,展现给用户; 但是当要表示某些字段的数据为异常数据,或者将一些关键信息以不同颜色的形式呈现给用户时,而前端又不好判断,那么就可以由后端来控…...

如何在WordPress网站中设置双重验证,提升安全性
随着互联网的不断进步,网站的安全问题越来越受到重视。尤其对于WordPress这样常用的建站平台,安全性显得尤为重要。尽管WordPress自带一定的安全性,但仅依靠用户名和密码的登录方式仍然存在风险。因此,启用“双重验证”便成为了提…...

Python 虚拟环境管理:venv 与 conda 的选择与配置
文章目录 前言一、虚拟环境的核心价值1.1 依赖冲突的典型场景1.2 隔离机制实现原理 二、venv 与 conda 的架构对比2.1 工具定位差异2.2 性能基准测试(以创建环境 安装 numpy 为例) 三、venv 的配置与最佳实践3.1 基础工作流3.2 多版本 Python 管理 四、…...

8.Android(通过Manifest配置文件传递数据(meta-data))
配置文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"tr…...

三网通电玩城平台系统结构与源码工程详解(二):Node.js 服务端核心逻辑实现
本篇文章将聚焦服务端游戏逻辑实现,以 Node.js Socket.io 作为主要通信与逻辑处理框架,展开用户登录验证、房间分配、子游戏调度与事件广播机制的剖析,并附上多个核心代码段。 一、服务端文件结构概览 /server/├── index.js …...

02_java的运行机制以及JDKJREJVM基本介绍
1、运行机制 2、JDK&JRE&JVM JDK 基本介绍 (1) JDK 的全称(Java Development Kit Java开发工具包) JDK JRE java的开发工具 [ java, javac, javadoc, javap等 ] (2)JDK是提供给Java开发人员使用的,其…...
istio使用ingress gateway通过header实现对不同服务的路由
要在 Istio 中使用 Ingress Gateway 实现基于 HTTP 头的服务路由,并对请求路径进行前缀去除(例如将 /api/details/xx 重写为 /xx),可以利用 Istio 的 Gateway 和 VirtualService 资源,通过配置路由规则和路径重写来实现…...

[论文阅读]REPLUG: Retrieval-Augmented Black-Box Language Models
REPLUG: Retrieval-Augmented Black-Box Language Models REPLUG: Retrieval-Augmented Black-Box Language Models - ACL Anthology NAACL-HLT 2024 在这项工作中,我们介绍了RePlug(Retrieve and Plug),这是一个新的检索增强型…...