nginx upstream转发连接错误情况研究
本次测试用到3台服务器:
192.168.10.115:转发服务器A
192.168.10.209:upstream下服务器1
192.168.10.210:upstream下服务器2
1台客户端:192.168.10.112
服务器A中nginx主要配置如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';keepalive_timeout 65;#gzip on;upstream testup{server 192.168.10.209 weight=1 max_fails=1 fail_timeout=30s;server 192.168.10.210 weight=1 max_fails=1 fail_timeout=30s;}server {listen 80;server_name localhost;#charset koi8-r;access_log logs/host.access.log main;location / {#root html;#index index.html index.htm;proxy_next_upstream http_502 http_504 error timeout invalid_header;proxy_ignore_client_abort on;proxy_send_timeout 60s;proxy_read_timeout 300s;proxy_next_upstream_tries 0;proxy_pass http://testup;proxy_set_header Host $host:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_connect_timeout 3;proxy_redirect default;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
nginx工作进程配置为2,
服务器1和服务器2都是普通的web服务配置不在此展示了
服务器1页面1:

服务器2页面2:

正常访问服务器A会在如上页面1和2之间切换
测试情况1:关闭服务器1
请求A地址,先卡顿差不多3s(应该与'proxy_connect_timeout 3'相关)然后切换成页面2内容,随后刷新无任何卡顿,30s(nginx相关配置:'max_fails=1 fail_timeout=30s')过后再次请求仍会卡顿3s成功随后并不卡顿,nginx报错日志如下:
2024/09/21 18:23:19 [error] 6056#0: *114 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.209:80/", host: "192.168.10.115"
测试情况2:不关闭服务器1,只关闭其nginx服务
请求A地址,不出现卡顿,页面一直显示的页面2内容。nginx报错日志:
2024/09/21 18:30:14 [error] 6055#0: *133 connect() failed (113: No route to host) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.209:80/", host: "192.168.10.115"
2024/09/21 18:30:48 [error] 6055#0: *133 connect() failed (113: No route to host) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.209:80/", host: "192.168.10.115"
此处说明'proxy_connect_timeout 3'针对的是请求能否转达服务器,与目标服务器上的nginx服务是否正常运行无关。
测试情况3:关闭服务器1和2(2选择的是屏蔽了对外端口)
请求A地址,卡顿了差不多6,7s出现如下页面:

此处应该是先后请求了两个服务器耗时3*2s,随后请求不卡顿直接返回如上页面,30s后继续请求仍会卡顿6s随后不卡顿。nginx报错日志:

此处前两条分别是两台服务器的超时日志,后续的日志“no live upstreams while connecting to upstream”是nginx在由于之前请求超时已经判断两台机器都不可用,在30s不会再去转发请求到该服务器,没有了可用的upstreams直接报该错误。
测试情况4:模拟慢网情况
恢复服务器1,2的正常访问,保证访问A地址能正常在页面1,2之前切换。
模拟网络延迟:
tc qdisc add dev ens33 root netem delay 1000ms
参考文档:1分钟学会在Linux下模拟网络延迟_linux模拟网络延迟-CSDN博客
这里将服务器A的nginx配置'proxy_connect_timeout'值改为1。如果喜欢等待的老铁也可以选择不改,但上面的延迟时间要改为3000ms了。这延迟那真的是连xshell连接服务器的输入输出都延迟了╮(╯▽╰)╭,只要是走网卡的应该都会被卡一下。
此时访问A地址,卡顿了一段时间后页面如下:

与之前的关闭服务器1,2的情况大致一样。首次卡顿了4,5s返回如上页面,随后刷新2s返回,过30s后仍会卡顿4,5s返回。错误日志输出情况也与情况3一致。
将服务器A的nginx配置'proxy_connect_timeout'值改为2。继续请求A地址,差不多4,5s返回页面1或页面2,并且页面内容正常切换。
测试情况4.2:调整proxy_next_upstream_tries
在情况4的弱网请求失败情况下,修改'proxy_next_upstream_tries'值为1,请求A地址3次。nginx错误日志:
2024/09/21 21:03:10 [notice] 6399#0: signal process started
2024/09/21 21:03:29 [error] 6401#0: *396 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.209:80/", host: "192.168.10.115"
2024/09/21 21:03:40 [error] 6401#0: *396 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.210:80/", host: "192.168.10.115"
2024/09/21 21:03:49 [error] 6401#0: *396 no live upstreams while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://testup/", host: "192.168.10.115
修改'proxy_next_upstream_tries'值为2,请求A地址2次,错误日志:
2024/09/21 21:23:16 [error] 6432#0: *413 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.209:80/", host: "192.168.10.115"
2024/09/21 21:23:17 [error] 6432#0: *413 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.210:80/", host: "192.168.10.115"
2024/09/21 21:23:22 [error] 6432#0: *413 no live upstreams while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://testup/", host: "192.168.10.115"
相较于上次修改配置,这次请求第一次就连续尝试连接209和210,都失败,归为不可用,第二次请求直接返回“no live upstreams”报错。
再次修改'proxy_next_upstream_tries'值为3,请求A地址2次,错误日志:
2024/09/21 21:28:59 [error] 6446#0: *423 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.209:80/", host: "192.168.10.115"
2024/09/21 21:29:00 [error] 6446#0: *423 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.10.210:80/", host: "192.168.10.115"
2024/09/21 21:29:12 [error] 6446#0: *423 no live upstreams while connecting to upstream, client: 192.168.10.112, server: localhost, request: "GET / HTTP/1.1", upstream: "http://testup/", host: "192.168.10.115"
跟上次测试日志输出一样,upstream下总共就2台服务器,不会因为proxy_next_upstream_tries的值大于2就循环再次请求第一个服务器。所以proxy_next_upstream_tries的值大于转发的服务器的数量时以服务器数量为准。proxy_next_upstream_tries值为0的时候从日志上看应该是按照服务器数量尝试连接的。
测试情况4.3:调整max_fails
配置nginx中max_fails值改为2,请求地址A3次,前两次请求时间明显较长,报错日志:

30s内每个upstream下服务器连接超时2次,才都判定为不可用时,最后一次请求出现“no live upstream”。
至此,想要测试的差不多结束了。
最后测试完记得删除网络延迟:
tc qdisc del dev ens33 root
如果上述测试对您有学习和工作有所帮助就点个赞吧!
相关文章:
nginx upstream转发连接错误情况研究
本次测试用到3台服务器: 192.168.10.115:转发服务器A 192.168.10.209:upstream下服务器1 192.168.10.210:upstream下服务器2 1台客户端:192.168.10.112 服务器A中nginx主要配置如下: log_format main…...
alias 后门从入门到应急响应
目录 1. alias 后门介绍 2. alias 后门注入方式 2.1 方式一(以函数的方式执行) 2.2 方式二(执行python脚本) 3.应急响应 3.1 查看所有连接 3.2 通过PID查看异常连接的进程,以及该进程正在执行的命令行命令 3.3 查看别名 3.4 其他情况 3.5 那么检查这些…...
【远程调用PythonAPI-flask】
文章目录 前言一、Pycharm创建flask项目1.创建虚拟环境2.创建flask项目 二、远程调用PythonAPI——SpringBoot项目集成1.修改PyCharm的host配置2.防火墙设置3.SpringBoot远程调用PythonAPI 前言 解决Pycharm运行Flask指定ip、端口更改无效的问题 首先先创建一个新的flask项目&…...
[今日Arxiv] 思维迭代:利用内心对话进行自主大型语言模型推理
思维迭代:利用内心对话进行自主大型语言模型推理 Iteration of Thought: Leveraging Inner Dialogue for Autonomous Large Language Model Reasoning URL:https://arxiv.org/abs/2409.12618 注:翻译可能存在误差,详细内容建议…...
glTF格式:WebGL应用的3D资产优化解决方案
摘要 glTF作为一种高效的3D资产格式,为WebGL、OpenGL ES和OpenGL运行时的应用提供了强有力的支持。它不仅简化了3D模型的传输与加载流程,还通过优化资产大小,使得打包、解包更加便捷。本文将深入探讨glTF格式的优势,并提供实用的代…...
Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行
1. Unity3D介绍 Unity3D是虚拟现实行业中,使用率较高的一款软件。 它有着强大的功能,是让玩家轻松创建三维视频游戏、建筑可视化、实时三维动画等互动内容的多平台、综合型 虚拟现实开发工具。是一个全面整合的专业引擎。 2. Unity安装 官网 : Unity…...
数据结构与算法——Java实现 8.习题——移除链表元素(值)
祝福你有前路坦途的好运,更祝愿你能保持内心光亮 纵有风雨,依然选择勇敢前行 —— 24.9.22 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示…...
如何理解MVCC
MVCC是什么? MVCC,是MultiVersion Concurrency Control的缩写,翻译成中文就是多版本并发控制,多个事务同时访问同一数据时,调控每一个事务获取到数据的具体版本。和数据库锁一样,它也是一种并发控制的解决…...
在 Qt 中使用 QLabel 设置 GIF 动态背景
文章目录 在 Qt 中使用 QLabel 设置 GIF 动态背景本文食用注意目标实现步骤1. 准备工作2. 修改头文件 widget.h3. 实现构造函数和析构函数4. 调整背景大小5. 完整代码分析6. 运行程序 总结 在 Qt 中使用 QLabel 设置 GIF 动态背景 在 Qt 中,如果希望在窗口中设置一…...
Flyway 数据库差异处理
Flyway 数据库差异处理详解 在软件开发过程中,数据库 schema 的变更是不可避免的,尤其是在多人协作、多环境部署时,不同环境中的数据库结构可能出现差异。Flyway 作为一个数据库迁移工具,通过版本控制和自动化迁移,确…...
CSS 选择器的分类与使用要点一
目录 非 VIP 用户可前往公众号进行免费阅读 标签选择器 id 选择器 类选择器 介绍 公共类 CSS 中优先用 class 选择器,慎用 id 选择器 后代选择器 交集选择器 以标签名作为开头 以类名作为开头 连续交集 并集选择器(分组选择器) 通配符* 儿子选择器 >(IE7…...
无人机集群路径规划:麻雀搜索算法(Sparrow Search Algorithm, SSA)求解无人机集群路径规划,提供MATLAB代码
一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化…...
harbor集成trivy镜像扫描工具
harbor项目地址:GitHub - goharbor/harbor: An open source trusted cloud native registry project that stores, signs, and scans content. 前置条件:安装好docker和docker-compose 一、安装harbor 1、下载harbor安装包并解压 wget https://github.com/goharbor/harbo…...
DMA学习
一、DMA简介 DMA是一种无需CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。 DMA方式的数据传输由DMA控制器(DMAC)控制,在传…...
C语言18--头文件
头文件的作用 通常,一个常规的C语言程序会包含多个源码文件(.c),当某些公共资源需要在各个源码文件中使用时,为了避免多次编写相同的代码,一般的做法是将这些大家都需要用到的公共资源放入头文件ÿ…...
vscode软件在 C发中常用插件
一. 简介 本文简单介绍一下,当做 C开发时 vscode软件常用的插件。 vscode软件是 微软公司目前提供的一款免费的开发软件,可以通过 vscode官网下载 vscode。 二. vscode软件在 C开发中常用插件 注意:vscode软件安装后,可以直接…...
【C++ Primer Plus习题】17.2
大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <fstream> using namesp…...
Vue Props传值
Props用于父组件向子组件传值 定义类型 // 定义一个接口,用来限制Teacher的属性 export interface Teacher {name: string;age: number;gender: string; }export type teacherList Teacher[];// 一个自定义类型 export type Teachers Array<Teacher>;父组件 <scr…...
FreeSWITCH event_socket 配置从其他地址连接
FreeSWITCH 默认配置只能 在本机连接, 要从 其他ip连接, 需要如下配置: 1、修改event_socket.conf.xml 1 <configuration name"event_socket.conf" description"Socket Client">2 <settings>3 <param name"nat-map&…...
信息安全数学基础(19)同余式的基本概念及一次同余式
一、同余式概念 同余式是数论中的一个基本概念,用于描述两个数在除以某个数时所得的余数相同的情况。具体地,设m是一个正整数,a和b是两个整数,如果a和b除以m的余数相同,则称a和b模m同余,记作a≡b(mod m)。反…...
开发效率翻倍:用快马智能推荐最佳排序算法,告别性能焦虑
今天想和大家分享一个提升开发效率的实用技巧——如何快速找到最适合当前场景的排序算法。作为开发者,我们经常需要处理各种排序需求,但面对不同规模、不同特征的数据集时,如何选择最优算法往往让人头疼。 数据准备阶段 在实际项目中…...
绝区零智能协同系统:AI驱动的游戏效率倍增解决方案
绝区零智能协同系统:AI驱动的游戏效率倍增解决方案 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 在当代游戏生…...
串口转HID实战:CH9329芯片在无外网环境下的应用指南
CH9329芯片串口转HID实战:隔离环境下的设备控制方案 在工业控制、医疗设备和某些特殊应用场景中,经常需要在物理隔离的网络环境下实现设备控制。CH9329芯片作为一款串口转HID(人机接口设备)的专业芯片,为解决这类问题提…...
避开这些坑!群晖+acme.sh申请Let’s Encrypt证书的完整指南
群晖NAS上零踩坑申请Lets Encrypt证书的终极实践手册 每次看到浏览器地址栏那个刺眼的"不安全"提示就浑身难受?作为群晖深度用户,我花了三个周末时间踩遍了所有证书申请的坑。从idn指令缺失到nss验证失败,从API调用超时到证书自动更…...
算法优化中的寄存器重用与内存映射策略的技术6
寄存器重用与内存映射策略在算法优化中的重要性寄存器重用和内存映射是提升计算密集型算法性能的关键技术,通过减少数据访问延迟和优化存储层次结构的使用,显著提高执行效率。寄存器重用的核心方法与技术数据局部性利用 通过循环展开(Loop Un…...
ubuntu系统检测内核配置是否支持Docker核心模块
有一些内核缺少 Docker 所需的核心模块(overlayfs、bridge、iptables 相关等)所以在安装docker之前可以先检查一下。 脚本,可以检测Kernel配置是否符合Docker的运行要求 源地址:https://github.com/moby/moby/blob/master/contr…...
陀螺匠企业助手-产品
1. 功能说明维护出售产品的基本信息数据,支持在添加商机/合同中进行选择。2. 进入产品页面路径:客户>产品管理>产品3. 新增产品功能说明:维护产品信息,添加完成的产品信息,可以在添加商机/合同中进行选择。新增产…...
Nuxt4 官网访问来源统计的实现
今天我遇到一个值得记录的问题,场景是这样的:官网后台需要做访问统计,我得把访问来源和访问目标的 URL 传递给后端。绕了好一阵子,才终于理清楚。 项目结构上,Nuxt 4 负责官网展示,后端是 Java 服务。核心…...
多项式朴素贝叶斯
多项式朴素贝叶斯(二分类) 题意 实现一个 Multinomial Naive Bayes 二分类器。 train:二维列表,每行最后一列为标签 y \in \{0,1\},其余列为非负整数词频test:二维列表,仅包含词频特征ÿ…...
避坑指南:Pyannote3.1+Whisper本地部署的5个常见报错解决方案
避坑指南:Pyannote3.1Whisper本地部署的5个常见报错解决方案 语音处理技术正在重塑教育、会议记录和客服质检等场景的交互方式。当开发者尝试将Whisper的精准语音识别与Pyannote的说话人分离能力结合时,常会在环境配置环节遭遇"拦路虎"。本文…...
