Nginx系列之反向代理过程

news/2024/5/18 18:00:55/文章来源:https://blog.csdn.net/qiaotl/article/details/127067380

nginx通过proxy模块对上游服务使用http/https协议进行反向代理,下图是反向代理处理过程

在读取客户端发送的请求时,如果proxy_request_bufferring=on,那么读取完整的包体后再发送给后端服务,如果 proxy_request_bufferring=off,则是边读取包体,边发送。在服务端返回请求响应的包体时,通过proxy_bufferring=on/off来控制接收完整响应包体或是边发送边读取。下面的内容将围绕反向代理的过程来展开,介绍处理过程中涉及的指令、配置项等。

proxy_pass配置规则

在使用proxy模块时有个地方容器犯错,即proxy_pass后面的url是否带URI,对发送的的URI的影响
1.url必须以http://或者https://开头,然后是域名或者IP地址或者upstream名字,域名和IP地址后可加端口,最后是可选的URI
2.1当URL参数中携带了URI,nginx会修改URL,将location参数中匹配上的一段值替换成proxy_pass中配置的URI
2.2当URL参数中不携带URI,nginx将客户端转发的URI直接转发给上游。实验结果如下图所示,proxy_pass中无“/addurl”时,原样转发客户端发送的URI,当proxy_pass中有"/addurl"时,用curl命令"curl taoli.test.pub:8040/a/b/c"时,/a被替换成了/addurl

反向代理处理过程中涉及的配置项说明

proxy模块提供了很多配置项来控制读取客户端发送的请求的行为,具体的配置项与作用如下所示
proxy_method: 指定发往后端服务的方法(GET/POST等)
proxy_http_version:设置http的版本,默认是1.0,有些特性在1.1才支持。
proxy_set_header field value:添加发往后端服务的header,如果value为空字符串,则整个header都不会发往后端服务
proxy_set_body value:设置发往后端服务的请求body(如果要发送body还需把proxy_pass_request_body设置为on)
proxy_request_buffering on | off: 控制接收完整个请求body后再发送,或边接收边转发。通常情况下建议设置为on,因为nginx作为反向代理服务器,吞吐量高于后端服务处理速率和客户端发送速率,如果边接收边转发,可能存在Nginx等待的情况,所以,如果是高吞吐量的场景,设置为on。设置为on后,如果内容很小会直接写在内存中进行转发,如果内容很大,会写入磁盘,这里就存在时间消耗,如果对响应要求非常及时的场景,可以设置为off。
client_body_buffer_size size: 若接收头部时已经完全接收了完整包体,则不分配,若剩余待接收包体长度小于client_body_buffer_size,则仅分配所需大小,如果剩余待接收包体大于client_body_buffer_size,关闭包体缓存时,该内存上的内容会及时发送给上游,打开包体缓存时,该段大小内存用完时,写入临时文件,释放内存。
client_max_body_size size: 控制最大包体大小,该配置如果要生效,请求头部中需要包含Content-Length,如果超出最大限制,返回413错误。
client_body_temp_path path: 设置临时存放文件路径
client_body_timeout: 设置读取包体的超时时间,超时后返回408错误

下图是proxy的一些配置,使用proxy_set_body设置转发请求的body值,当用curl命令访问nginx时,可以使用tcpdump命令查看发送的body内容,可以看到和设置的内容(hello world)一致。

上面是读取客户端请求时的一些配置,nginx与后端服务交互,建立连接,获取后端服务返回的响应内容时,也有一些配置项来控制处理返回响应的行为,配置项及作用说明如下所示

proxy_connect_timeout time: 默认值60s,向上游服务建立连接的超时时间,超时后返回502错误
proxy_socket_keepalive on|off: 上游连接启用TCP keepalive,TCP的keepalive是为了把不可用的TCP连接提前关闭,释放系统资源
keepalive connections: 上游连接启动HTTP keepalive,HTTP的keepalive是为了多个HTTP请求复用TCP连接,减少握手、慢启动带来的性能消耗。开启keepalive的好处是性能更高,坏处是问题定位更困难些
keepalive_requests numbers: 设置最多可并发处理的请求数
proxy_send_timeout time: 向后端服务发送http请求的超时时间设置,默认是60s
proxy_buffer_size size: 接收后端服务HTTP响应头部的内存大小,如果超出内存,在error.log中会记录upstream sent too big header
proxy_buffers number size: 接收后端服务返回的HTTP包体所需的内存大小
proxy_buffering on | off: 接收后端服务返回的包体时,设置为on,接收完整个包体后再转发给客户端,设置为off,边接收边转发。默认设置为on
proxy_temp_path path: 接收返回的响应包体时,如果超出内存则需要存储在磁盘上,这里设置存放内容的路径
proxy_max_temp_file_size size: 磁盘中临时存放的文件的最大值
proxy_store_access users:permissions: 对持久化的读写权限设置
proxy_store on|off:是否把后端服务返回的响应包体写入磁盘,进行持久化存储

除了设置某个字段以及值,Nginx还提供禁止某些字段生效的功能。语法格式 proxy_ignore_header filed.例如下面的头部字段是nginx提供给后端服务来控制的。也可以通过proxy_ignore_headers来禁止这些字段生效
X-Accel-Redirect: 由后端服务(upstream服务)指定在nginx内部重定向,控制请求的执行
X-Accel-Limit-Rate: 由后端服务设置发送客户端的响应的速度限制,和limit_rate作用相同,区别是limit_rate是在nginx中配置,该字段是nginx留给后端服务来控制的
X-Accel-Buffering: 由后端服务控制是否缓存后端服务返回的响应
X-Accel-Charset: 由后端服务控制Content-Type中的Charset
除了上面的字段,还有一些与缓存相关的字段,也可以通过proxy_ingore_header field来禁止这些字段生效。
X-Accel-Expires: 设置响应在nginx中缓存时间,单位秒
Expires: 控制nginx缓存时间,优先级低于X-Accel-Expires
Cache-Control: 响应中出现Set-Cookie则不缓存
Vary: 响应中出现Vary:*则不缓存
上面是禁止返回的响应header中某些字段生效,除此之外,nginx还提供了proxy_hide_header field指令来控制某些头部的字段不返回给客户端,也提供了proxy_pass_header来控制头部字段会被转发,即便是已经配置在proxy_hide_header的字段,配置了proxy_pass_header后,也会转发这个头部字段。还有一些头部字段,Nginx默认是不转发的,如果要转发也需要通过proxy_pass_header进行设置,例如下面的头部字段:
Date: 由ngx_http_header_filter_module过滤模块填写,值为nginx发送响应头部的时间
Server:由ngx_http_header_filter_module过滤模块填写,值为nginx版本
X-Accel-: 用户控制nginx响应行为的字段,默认不会发给客户端

下面是一个演示demo,在后端服务上设置新的header字段和值(authHeader:headerValue),当访问nginx后,返回了后端服务新增的头部字段,另外,通过proxy_pass_header field设置,返回的请求中也显示了Server这个默认不返回的头部字段。

后端服务出现异常后的容错处理方案

通过proxy_next_upstream模块,可以对后端服务返回的错误进行容错处理,语法格式:proxy_next_upstream  error|timeout|invalid_header|http_500 |http_xx|off;不同参数的含义如下

error                   表示和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误
timeout                 表示和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时
invalid_header          表示后端服务器返回空响应或者非法响应头
http_500                表示后端服务器返回的响应状态码为500
http_502                表示后端服务器返回的响应状态码为502
http_503                表示后端服务器返回的响应状态码为503
http_504                表示后端服务器返回的响应状态码为504
http_404                表示后端服务器返回的响应状态码为404
off                     表示停止将请求发送给下一台后端服务器</pre>
proxy_intercept_errors on|off 
当后端服务响应码大于等于300时,设置为on,按error_page处理,设置为off,将响应返回给客户端

下面是proxy_next_upstream的配置。

 访问/error这个url,此关闭8013端口的监听,即模拟的8013端口的服务无法连接上,左边是proxy_next_upstream=off的实验结果,当轮询访问到8013端口的服务时,返回了502错误,右边是proxy_next_upstream=on的实验结果,服务把请求都转发到了8011端口这个正常服务上,不会返回502的异常信息。

下面的左边是访问/httperror的结果,刷新配置后,首次访问会返回502,后面都会把请求转发到正常的服务上,即8011端口的服务上。右边是访问/intercept的结果,当8013端口的服务处于完全无法连接的情况时,访问返回502的错误码,但是当8013端口的服务能连接,但是服务返回300以上的状态码时,按error_page进行处理,这里error_page是显示nginx/html/test.txt文件内容。

 

以上就是Nginx作为反向代理处理请求过程中涉及的常用配置介绍。

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

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

相关文章

DDL操作表-查询和DDL操作表-创建

DDL操作表-查询 1.C(Create):创建 2.R(Retrieve):查询 3.U(Update):修改 4.D(Delete):删除 R(Retrieve):查询 查询某个数据库中所有的表名称show tables;查询表结构desc 表名; DDL操作表-创建 C(Create):创建 1.语法:create table 表名(列名  数据类型1,列…

指针初阶详解

目录序言地址指针是什么指针和指针变量为什么定义指针指针指针的大小类型指针的解引用指针-整数指针运算指针 - 指针指针比较野指针二级指针指针数组序言 指针这个模块是C语言里面比较难理解的的,学习成本倒是不高,就是有点费脑子.我们这里重点关注什么是指针和指针的用法.这篇…

Fast.ai 的新课来了,给你详细介绍 Stable Diffusion 原理

最近跟学生们学了个新词儿&#xff0c;叫做「双厨狂喜」。一般形容两个知名创作者合作出来的作品 ------ 例如视频或者直播等 ------ 很受大伙儿欢迎。这次&#xff0c;告诉你一个好消息&#xff0c;fast.ai 要和 Huggingface, Stability.ai&#xff08;Stable Diffusion 作者之…

[BJDCTF2020]EasySearch

解题&#xff1a; 进入环境只有 一个登录框&#xff0c;一般我的思路都是先用 万能密码登录一下&#xff0c;不行的话就扫源码 发现 index.php.swp 文件 <?phpob_start();//加密function get_hash(){$chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234…

PDF转word格式如果失败了,可以这样做

PDF是可以直接转成Word格式&#xff0c;方法也很简单&#xff0c;只需要把PDF另存为就可以了。 首先&#xff0c;在PDF的【文件】下选择【另存为】&#xff0c;然后选择新的保存路径。 出现新的对话框后&#xff0c;在【保存类型】那里选择【Word】格式&#xff0c;再点击保存…

连接打印机出现错误0X00000709怎么解决?

在使用打印机的时候&#xff0c;出现系统提示&#xff1a;操作无法完成&#xff08;错误0x00000709&#xff09;&#xff0c;再次检查打印机名称&#xff0c;并确保打印机已连接到网络。该怎么办呢&#xff1f;下面小编总结了这个问题的几种解决办法&#xff0c;总有一种适合你…

SpringCloud2——Nacos配置管理

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

基于html和Node.js的网页音乐播放器设计

目录 实验报告 1 【实验工具】 1【运行方法】 1【文件说明】 1【使用说明】 2 没有生成目录时的页面 3 生成目录后&#xff0c;自动播放歌曲 4 显示状态的歌词与目录 5 隐藏状态的歌词与目录 6 5.【实现方式】 7 1.目录生成&#xff1a; 7 2.切换歌曲 7 3.获取歌词 7 4.单曲循…

AI大佬怼怼怼的背后,究竟暗藏哪些玄机?

整理 | 杨阳出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;四年前&#xff0c;纽约大学教授Marcus为反驳深度学习三巨头之一Bengio的“有意识先验”和“解纠缠观念”理论&#xff0c;发表了一篇名为《Deep Learning: A Critical Appraisal》的论文&#…

91-Lucene+ElasticSeach核心技术

LuceneElasticSeach什么是全文检索&#xff1a; 数据分类&#xff1a; 我们生活中的数据总体分为两种&#xff1a;结构化数据和非结构化数据 结构化数据&#xff1a;指具有固定格式或有限长度的数据&#xff0c;如数据库&#xff0c;元数据等 非结构化数据&#xff1a;指不…

Springboot+采用协同过滤算法的家政服务平台的设计与实现 毕业设计-附源码260839

Springboot家政服务平台 摘 要 协同过滤算法是一种较为著名和常用的推荐算法&#xff0c;它基于对用户历史行为数据的挖掘发现用户的喜好偏向&#xff0c;并预测用户可能喜好的产品进行推荐。基于协同过滤算法的家政服务平台就是典型的信息管理平台,它主要通过使用Springboot框…

GAN Step By Step (一步一步学习GAN)

GAN Step By Step 心血来潮 GSBS&#xff0c;顾名思义&#xff0c;我希望我自己能够一步一步的学习GAN。GAN 又名 生成对抗网络&#xff0c;是最近几年很热门的一种无监督算法&#xff0c;他能生成出非常逼真的照片&#xff0c;图像甚至视频。GAN是一个图像的全新的领域&#…

基于Netty,从零开发一个im即时通讯

业务场景&#xff1a; 本次实战就是模拟微信的IM聊天&#xff0c;每个客户端和服务端建立连接&#xff0c;并且可以实现点对点通信&#xff08;单聊&#xff09;&#xff0c;点对多点通信&#xff08;群聊&#xff09;。 设计思路&#xff1a; 我们要实现的是点&#xff08;客户…

Linux基本指令之网络通信命令

目录 1、netstat监控命令 2、lsof&#xff1a;查看端口被占用情况 3、ss&#xff1a;显示更多更详细的有关 TCP 和连接状态的信息 4、nc和nmap:扫描别人机器上开放了哪些端口。 5、查看系统资源使用情况 1、glances&#xff1a;监听系统CPU、内存、磁盘I/O等使用情况 2、…

LabVIEW编程语法学习笔记之变量

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 与其他通用编程语言一样&#xff0c;LabVIEW中也有局部变量和全局变量的概念&#xff0c;用来控制变量的作用范围。 局部变量 局部变量的作用范围仅为其所在VI&#xff0c;其他VI对该局部变量不可见。 在LabVIEW中添加一…

[Python]Django简介

前言 系列文章目录 [Python]目录 视频及资料和课件 链接&#xff1a;https://pan.baidu.com/s/1LCv_qyWslwB-MYw56fjbDg?pwd1234 提取码&#xff1a;1234 文章目录前言1. Django简介1.1 Django的特点2. MVC和MVT2.1 MVC2.2 MVT1. Django简介 官方网站GitHub源码 Django&…

ArrayList在使用foreach进行删除的时候,为什么在删除倒数第二个元素的时候不会抛异常,其他情况会抛异常的原理解析

首先准备一个list进行简单的赋值操作。 public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);// 迭代器 IteratorIterator<Integer> itr list.iterator();while(itr.hasNext…

Python 图像处理 PIL 第三方库详细使用教程(更新中)

Pillow 库 基本概述 Python Pillow PIL 库的用法介绍&#xff0c;Pillow库是一个Python的第三方库。 要点&#xff1a;PIL库是一个具有强大图像处理能力的第三方库&#xff0c;不仅包含了丰富的像素、色彩操作功能&#xff0c;还可以用于图像归档和批量处理。 官方文档路径&am…

达梦数据库超出全局hash join空间(超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE的错误)

问题&#xff1a; 达梦8通过多个left join on 查询往表里查数据报超出全局hash join 空间&#xff0c;适当增加hj_buf_global_size的错误 解决方案&#xff1a; 执行SQL查看HJ_BUF_GLOBAL_SIZE参数 select * from SYS."V$DM_INI" where PARA_NAME HJ_BUF_GLOBAL_…

基于SpringBoot大学生成长记录系统【Java毕业设计·安装调试·代码讲解·文档报告】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…