Nginx参数配置-笔记
文章目录
- upstream实现后台应用服务负载均衡&高可用
- proxy_set_header参数
upstream实现后台应用服务负载均衡&高可用
角色 | IP |
---|---|
nginx | 172.168.110.2 |
后端应用服务1 | 172.168.110.3 |
后端应用服务2 | 172.168.110.4 |
后端应用服务3(备用) | 172.168.110.5 |
示例如下:
upstream myservers {server 172.168.110.3:9003 weight=1 max_fails=2 fail_timeout=30;server 172.168.110.4:9003 weight=2 max_fails=2 fail_timeout=30;server 172.168.110.5:9003 backup;
}server {listen 3333;server_name localhost;location / {proxy_pass http://myservers/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
上面配置解释:
weight:访问权重。如果不配置权重情况下,用户请求默认是轮询访问后端应用服务1、服务2 ,例如10次请求中,5次访问服务1,5次访问服务2。当权重设置1和2后,那么后端应用服务1、服务2的请求访问比例变为1:2。
max_fails=2 fail_timeout=30:在30(fail_timeout)s内,如果某个服务出现2(max_fails)次访问失败,那么在接下来的30s(fail_timeout)s中,不会给将请求转发给该服务。
backup:当upstream中所有服务都访问失败,而进入fail_timeout时,那么此时会将请求转发给配置了backup的备用服务器进行处理。
Nginx实现应用服务高可用原理:假设上面示例中,后台应用服务1挂掉,此时用户发起请求,假设请求刚好落到那台故障的后台应用服务1,此时前端用户是否会看到报错,例如404?答案是否,因为nginx尝试让应用服务1处理请求,发现服务1挂掉(例如发现应用服务的端口不通、连接超时等),不会马上返回错误结果给用户,而是转而让后台应用服务2去处理请求,服务2响应成功后,nginx才会把响应的成功结果响应给用户。故而哪怕服务1出现故障,nginx在收到多次请求时,不会说部分请求能成功,部分请求失败,即对用户来说,是无感的,此方式为nginx upstream的被动检测,即每次收到请求时进行处理时才进行检测,还有一种为主动检测,即nginx定期对后端服务进行检测,这样效率更较高,对用户更友好,大家可以去了解下这块。 当然,要实现真正的应用服务高可用,除了应用服务是多实例,Nginx也必须是集群,而不能是单点。
proxy_set_header参数
具体可参考:https://blog.csdn.net/bao19901210/article/details/52537279
你是否有发现location{}里面的配置,常常带有 proxy_set_header参数,
最常见的有:Host 、X-Real-IP、X-Forwarded-For ,他们有什么作用?
假设我的Nginx服务器地址是172.168.110.100,下面是Nginx的部分配置。
upstream myservers {server 172.168.110.3:9003;server 172.168.110.4:9003;
}server {listen 3333;server_name localhost;location / {# proxy_pass http://myservers/;proxy_pass http://172.168.110.85:9003/;proxy_set_header Host $htt_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
角色 | IP |
---|---|
用户PC | 172.168.110.1 |
nginx | 172.168.110.2 |
后端应用服务 | 172.168.110.3 |
访问流程如下:
- 用户(IP:172.168.110.1)访问nginx(IP:172.168.110.2)
- nginx(IP:172.168.110.2)访问后台应用服务(IP:172.168.110.3)
proxy_set_header Host $host :用于后台应用服务获取 用户访问本请求时使用的Host。有无设置的区别如下:
有设置:那么后台应用服务通过请求头拿到的“Host”值为172.168.110.2,即用户访问请求URL时使用的URL Host地址。
没有设置:那么后台应用服务拿到的“Host”值为172.168.110.3。即nginx代理服务器访问后台服务时使用的地址,即proxy_pass 参数后面的主机地址。例如你使用的是 proxy_pass http://myservers/,那么后台应用服务拿到的“Host”值为“myservers”。
proxy_set_header X-Real-IP $remote_addr :用于后台应用服务获取 真正的客户端IP地址。有无设置的区别如下:
有设置:那么后台应用服务通过请求头拿到的“x-real-ip”值为172.168.110.1,即用户发起请求所在PC的IP。
没有设置:那么后台应用服务获取不到“x-real-ip”值。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for :用于获取请求调用链的IP集合,用于请求转发过程跟踪。调用链IP包括:用户所在IP、进行请求转发nginx ip集合。有无设置的区别如下:
有设置:那么后台应用服务拿到的“x-forwarded-for”值为172.168.110.1。假设一个请求经过了若干次nginx的转发,那么此时X-Forwarded-For值为(用户IP, 第1次nginx转发时nginx的IP, 第2次nginx转发时nginx的IP…, 倒数第2个nginx服务器IP),注:调用链IP集合 不含最后一次nginx转发的nginx的IP。故而上面“x-forwarded-for”值只有用户IP,而不含nginx ip。因为在本次请求转发中,nginx只进行一次转发,即也是最后一次转发,而最后的一次转发没有被记录到“x-forwarded-for”中。。
没有设置:那么后台应用服务获取不到“x-forwarded-for”值。
相关文章:
Nginx参数配置-笔记
文章目录 upstream实现后台应用服务负载均衡&高可用proxy_set_header参数 upstream实现后台应用服务负载均衡&高可用 角色IPnginx172.168.110.2后端应用服务1172.168.110.3后端应用服务2172.168.110.4后端应用服务3(备用)172.168.110.5 示例如下: upstre…...
衡量神经网络表征相似度
目录 1.中心核对齐技术(CKA)2.Hilbert-Schmidt independence criterion(HSIC)HSIC的计算步骤:HSIC的性质:应用:矩阵中心化操作对于单个数据集的中心化对于两个数据集的中心化(例如,用于HSIC)Python代码示例1.中心核对齐技术(CKA) CKA通过计算两个表征的Gram矩阵(即…...
Javascript高级:深度解析与多种实现方式数组扁平化
数组扁平化:深度解析与多种实现方式 在JavaScript编程中,数组扁平化是一个常见的操作,指的是将一个多维数组转换成一个一维数组。这个过程中,所有嵌套的数组元素都会被“拉平”到同一个层级。数组扁平化在处理嵌套数据结构时非常…...

SpringBoot Data Redis连接Redis-Cluster集群
使用SpringBoot Data Redis无法连接Redis-Cluster集群 最近在研究系统高并发下的缓存架构,因此自己在自己买的云服务器上搭建好Redis 5.0 版本的集群后,使用springboot的 RedisTemplate连接是发现总是访问不到集群节点。上网百度了发现没有好的解决办法&…...

计算机网络——TCP篇
TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗? 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的? 一次握手:客户端发送带有 …...
【网络安全面经】技术性问题3
11. 一次完整的 HTTP 请求过程 域名解析:通过 DNS 将域名转换为 IP 地址,如上述 DNS 的工作原理。建立 TCP 连接:客户端向服务器发送 SYN 报文段,经过三次握手建立 TCP 连接。发送 HTTP 请求:客户端向服务器发送 HTTP…...

前后端交互之动态列
一. 情景 在做项目时,有时候后会遇到后端使用了聚合函数,导致生成的对象的属性数量或数量不固定,因此无法建立一个与之对应的对象来向前端传递数据,这时可以采用NameDataListVO向前端传递数据。 Data Builder AllArgsConstructo…...

递归(3)----力扣40组合数2,力扣473火柴拼正方形
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,1…...
十一:HTTP 状态码详解:解读每一个响应背后的意义
HTTP(超文本传输协议)是网络通信的基石之一,主要用于客户端(例如浏览器)和服务器之间的通信。为了让服务器能准确地向客户端反馈请求的处理状态,HTTP设计了一套标准的状态码。每一个状态码代表了特定的含义,指示了请求的状态、潜在的问题或成功的信息。 1. 信息响应 (1…...

《译文》2024年11月数维杯国际大学生数学建模挑战赛题目
# 赛题正式发布 2024年第十届数维杯国际大学生数学建模挑战赛顺利开赛,竞赛开始时间为北京时间2024年11月15日09:00至北京时间2024年11月19日09:00,共计4天,竞赛题目正式发布,快来一起围观,你认为今年的哪个题目更具有…...
shell命令统计文件行数之和
你可以使用以下 shell 命令来统计每个 .txt 文件的行数,并将其加和在一起: find . -name "*.txt" -not -name "*.json" -exec wc -l {} + | awk {sum += $1} END {print sum} 解释: find . -name "*.txt" -not -name "*.json": f…...

第02章 CentOS基本操作
2.文件基本操作【文件操作(一)】 目标 理解Linux下路径的表示方法能够使用命令(mkdir和touch)在指定位置创建目录和文件能够使用命令(rm)删除指定的目录和文件能够使用命令(ls)列出目录里的文件能够使用命令(cat,head,tail,less,more)查看文件内容理解标…...
241113.学习日志——[CSDIY] [ByteDance] 后端训练营 [02]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...

【HOT100第三天】和为K的子数组,最大子数组和,合并区间,轮转数组
今天练的是子串和子数组专题 ~ (前缀和那里差点学死了) 560.和为K的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 先写个暴力法,用昨天刚学…...

设计模式-Adapter(适配器模式)GO语言版本
前言 个人感觉Adapter模式核心就在于接口之间的转换。将已有的一些接口转换成其他接口形式。并且一般用于对象上,而不是系统上 问题 就用一个简单的问题,懂数据结构的同学可能知道双端队列。那么就用双端队列实现一个栈(stack)或…...

SAM_Med2D 训练完成后boxes_prompt没有生成mask的问题
之前对着这这篇文章去微调SAM_Med2D(windows环境),发现boxes_prompt空空如也。查找了好长时间问题SAM-Med2D 大模型学习笔记(续):训练自己数据集_sam训练自己数据集-CSDN博客 今天在看label2image_test.json文件的时候发现了一些端倪: 官方…...

游戏引擎学习第18天
clang-format 相关的配置可以参考下面 .clang-format 是用来配置代码格式化规则的文件,主要用于 Clang-Format 工具。以下是 .clang-format 文件中的一些常用设置: 1. 基础设置 Language: Cpp # 指定语言 (C, C, Java, JavaScript, etc…...
Kotlin return与return@forEachIndexed
Kotlin return与returnforEachIndexed fun main() {val data arrayOf(0, 1, 2, 3, 4)println("a")data.forEachIndexed { index, v ->if (v 2) {//类似while循环中的continue//跳过,继续下一个forEachIndexed迭代returnforEachIndexed}println("…...
基于Canny边缘检测和轮廓检测
这段代码实现了基于Canny边缘检测和轮廓检测,从图像中筛选出面积较大的矩形,并使用OpenCV和Matplotlib显示结果。主要流程如下: 步骤详解: 读取图像: img cv2.imread(U:/1.png)使用cv2.imread()加载图像。 转换为灰…...
力扣题目解析--合并k个升序链表
题目 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...