当前位置: 首页 > article >正文

【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>
  1. 访问测试页面
    打开浏览器并访问 http://localhost:9090/test.html。页面会显示类似以下内容:
Nginx and Flask Test Page
Server Response: {"ip_info":"192.168.211.236","server":"server1"}

二、负载均衡策略

Nginx支持多种负载均衡算法:

  1. 轮询(默认)
upstream backend {server 192.168.1.101;server 192.168.1.102;
}
  1. 加权轮询
upstream backend {server 192.168.1.101 weight=3;server 192.168.1.102 weight=1;
}
  1. IP哈希(保持会话)
upstream backend {ip_hash;server 192.168.1.101;server 192.168.1.102;
}
  1. 最少连接数
upstream backend {least_conn;server 192.168.1.101;server 192.168.1.102;
}
  1. 基于响应时间(商业版)
upstream backend {fair;server 192.168.1.101;server 192.168.1.102;
}

三、高级配置选项

  1. 服务器状态参数
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服务器和反向代理服务器&#xff0c;提供了强大的负载均衡功能。本文将详细介绍Nginx负载均衡的配置方法和相关策略。 一、基础负载均衡配置 1.单服务示例配置 配置nginx.conf模块 在Nginx配置文件中定义upstream模块&#xff1a; worker_processes a…...

JVM——垃圾收集策略

GC的基本问题 什么是GC&#xff1f; GC 是 garbage collection 的缩写&#xff0c;意思是垃圾回收——把内存&#xff08;特别是堆内存&#xff09;中不再使用的空间释放掉&#xff1b;清理不再使用的对象。 为什么要GC&#xff1f; 堆内存是各个线程共享的空间&#xff0c…...

马克·雷伯特:用算法让机器人飞奔的人

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

信创系统资产清单采集脚本:主机名+IP+MAC 一键生成 CSV

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

SpringBoot获取用户信息常见问题(密码屏蔽、驼峰命名和下划线命名的自动转换)

文章目录 一、不返回password字段二、返回的createTime和updateTime为空原因解决&#xff1a;开启驼峰命名和下划线命名的自动转换 设置返回的日期格式 一、不返回password字段 在字段上面添加JsonIgnore注解即可 JsonIgnore // 在把对象序列化成json字符串时&#xff0c;忽略…...

小刚说C语言刷题—1602总分和平均分

1.题目描述 期末考试成绩出来了&#xff0c;小明同学语文、数学、英语分别考了 x、y、z 分&#xff0c;请编程帮助小明计算一下&#xff0c;他的总分和平均分分别考了多少分&#xff1f; 输入 三个整数 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安装路径 执行命令&#xff1a; which python3 以我这台电脑为例&#xff0c;路径为&#xff1a;/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语言中&#xff0c;函数栈帧是指在函数调用过程中&#xff0c;…...

Hadoop伪分布式模式搭建全攻略:从环境配置到实战测试

引言 作为大数据生态的基石,Hadoop凭借其高可靠性、扩展性成为分布式计算的首选框架。本文将手把手带你完成Hadoop伪分布式模式部署,通过单节点模拟集群环境,为后续学习MapReduce、YARN等核心组件打下基础 目录 引言 Hadoop 发展历史 1.1 起源(2002–2005) 1.1 安装JDK…...

Transformer:颠覆深度学习的架构革命与技术演进

2017年&#xff0c;谷歌团队在论文《Attention Is All You Need》中提出的Transformer架构&#xff0c;彻底改变了人工智能对序列数据的处理范式。它不仅解决了传统循环神经网络&#xff08;RNN&#xff09;的长期依赖和并行化难题&#xff0c;更催生了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低成本、无固件、高集成度无线充电电源接收器

无线充电 电子产品具有无线充电功能使用会更便利&#xff0c;介绍一款低成本、无固件、高集成度无线充电电源接收器NU1680 原理图和BOM可点绑定资源下载&#xff0c;LC部分电容建议X7R。 Load空载切满载测试 (CC Mode) – 尽量保证电子负载没有过冲 – 电子负载不要从0到满…...

JVM 内存分配策略

引言 在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率&#xff0c;而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理&am…...

2025MathorCup数学应用挑战赛B题

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

组件的基本知识

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

Origin绘图操作:图中迷你图绘制

一、背景描述 Origin绘图时&#xff0c;局部数据变化较小&#xff0c;在整体图片中表现为局部曲线重叠在一起&#xff0c;图中y1和y2在x0-2时重叠在一起&#xff0c;需要将局部放大&#xff0c;绘制迷你图 二、实现方法 1.在左边工具栏选择放大镜&#xff0c;按住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三级练习&#xff0c;一维数组练习&#xff08;C三级大纲中5号知识点&#xff0c;一维数组&#xff09;&#xff0c;难度★☆☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-3-luogu-b2089/ 【GESP】C三级练习 luogu-B2089 数组逆序重存放 | OneCoderGE…...

Copilot 上线深度推理智能体 Researcher

近日&#xff0c;微软推出两款首创的工作场景推理智能体&#xff1a;Researcher&#xff08;研究员&#xff09;和Analyst&#xff08;分析师&#xff09;。它们能以安全合规的方式访问您的工作数据&#xff08;包括邮件、会议、文件、聊天记录等&#xff09;及互联网信息&…...

QDrant数据构造及增删改查

QDrant数据构造及增删改查 一、PointStruct介绍 PointStruct 是一种结构体&#xff08;或数据类&#xff09;&#xff0c;通常用于表示&#xff1a; 向量数据库中的一个数据点&#xff08;Vector Point&#xff09;&#xff0c;包括它的 ID、向量值&#xff08;vector embedd…...

日常开发小Tips:后端返回带颜色的字段给前端

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

如何在WordPress网站中设置双重验证,提升安全性

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

Python 虚拟环境管理:venv 与 conda 的选择与配置

文章目录 前言一、虚拟环境的核心价值1.1 依赖冲突的典型场景1.2 隔离机制实现原理 二、venv 与 conda 的架构对比2.1 工具定位差异2.2 性能基准测试&#xff08;以创建环境 安装 numpy 为例&#xff09; 三、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 服务端核心逻辑实现

本篇文章将聚焦服务端游戏逻辑实现&#xff0c;以 Node.js Socket.io 作为主要通信与逻辑处理框架&#xff0c;展开用户登录验证、房间分配、子游戏调度与事件广播机制的剖析&#xff0c;并附上多个核心代码段。 一、服务端文件结构概览 /server/├── index.js …...

02_java的运行机制以及JDKJREJVM基本介绍

1、运行机制 2、JDK&JRE&JVM JDK 基本介绍 &#xff08;1&#xff09; JDK 的全称(Java Development Kit Java开发工具包) JDK JRE java的开发工具 [ java, javac, javadoc, javap等 ] &#xff08;2&#xff09;JDK是提供给Java开发人员使用的&#xff0c;其…...

istio使用ingress gateway通过header实现对不同服务的路由

要在 Istio 中使用 Ingress Gateway 实现基于 HTTP 头的服务路由&#xff0c;并对请求路径进行前缀去除&#xff08;例如将 /api/details/xx 重写为 /xx&#xff09;&#xff0c;可以利用 Istio 的 Gateway 和 VirtualService 资源&#xff0c;通过配置路由规则和路径重写来实现…...

[论文阅读]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 在这项工作中&#xff0c;我们介绍了RePlug&#xff08;Retrieve and Plug&#xff09;&#xff0c;这是一个新的检索增强型…...