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

Nginx: 代理场景下Nginx接收用户请求包体的处理

Nginx 反向代理图

  • 当用户发过来一个request body的时候,Nginx 是如何处理这样一个body
  • 这个body 它对应的就是我们客户请求的一些具体内容

1 )proxy_request_bufering 指令

  • 接收包体的两种方式
    • 接收完全部包体再发送
    • 一边接收包体一边发送
  • 接收包体的两种方式切换的相关指令
    • 语法:proxy_request_bufering on | off;
      • on 会在nginx上打开缓冲区(内存buffer),来缓存用户发送过来的请求包体
      • nginx 收到后一次性的转发给上游应用程序服务器
      • off 则不缓存,收到多少,转发多少
    • 默认值:proxy_request_buffering on;
    • 上下文:http、server、location
  • 配置成 on 的好处
    • 吞吐量要求比较高
    • 上游服务并发处理能力低
  • 配置成 off 的要求

    • 要求 应用程序服务器和Nginx服务器协调性能好
    • 如果两者性能匹配差距过大,则可能会出现瓶颈
  • 配置成 off 的好处

    • 更及时的响应
    • 减少Nginx磁盘IO

2 )client_max_body_size 指令

  • 决定 Nginx 能够处理的请求体的大小
  • 语法:client_max_body_size size;
  • 默认值:client_max_body_size 1M;
  • 上下文:http、server、location

3 )client_body_buffer_size

  • 设定的 buffer 缓冲区大小
  • 语法:client_body_buffer_size size;
  • 默认值:client_body_buffer_size 8k | 16k;
    • 32 位和64位系统的区别,8k 和 16k
    • 仅仅是默认值,可自行修改
  • 上下文:http、server、location

4 )场景

4.1 请求体过大

4.2 请求体小于缓存大小

4.3 请求体大于缓存缓存大小 (这里不能大于 client_max_body_size 的大小)

  • 请求体大小在请求头中的 Content-Length 中会保存, 这个HTTP请求中的请求头会有 Content-Length 字段,这个字段后面保存的值,就是我们整个请求的大小

5 ) client_body_in_single_buffer 指令

  • 请求体会分散到一块连续的空间,而非离散的存储,有利于提高性能
  • 语法:client_body_in_single_buffer on | off;
  • 默认值:client_body_in_single_buffer off;
  • 上下文:http、server、location

6 ) client_body_temp_path 指令

  • 请求体大于缓存设置大小,则将请求体临时存放的目录,nginx重启后会自动创建该目录
  • 语法:client_body_temp_path path [level1][level2][level3];
  • 默认值:client_body_temp_path client_body_temp;
    • client_body_temp 是默认目录名称,会在 nginx 根目录会存在
  • 上下文:http、server、location

7 )client_body_in_file_only 指令

  • 请求体是否会存放在磁盘文件上,on和clean 类似,但是 clean 会在请求完成后清理
  • 语法:client_body_in_file_only on | clean | off;
  • 默认值:client_body_in_file_only off;
  • 上下文:http、server、location

8 )client_body_timeout 指令

  • 指定用户和nginx建立连接之后没有发送请求体的超时时间,超时后自动断开
  • 语法:client_body_timeout time;
  • 默认值:client_body_timeout 60s
  • 上下文:http、server、location

9 )配置示例

9.1 Nginx 配置

upstream test_server {
	server 192.168.184.20:9001 weight=2 fail_timeout=10s max_fails=3;
}

server {
	listen 				80;
	server_name 	receive_body.baidu.com;
	location /receive/ {
		proxy_pass                    http://test_server;
		client_max_body_size        150k;
		# client_body_buffer_size      100k;
		# client_body_temp_path test_body_path; # 这个配置,重启nginx后会自动创建这个目录
		
		# client_body_in_file_only on; # 这个配合上面的 client_body_temp_path
		# client_body_in_single_buffer on;
		
		# proxy_request_buffering on;
		# clent_body_timeout 30;
}

9.2 后端上游应用服务器(这里也用nginx模拟)

server {
	listen 9001;
	server_name localhost;
	
	location / {
		return 200 'Proxy OK\n';
	}
}

9.3 测试

  • $ curl -F "file=@/opt/nginx/conf.d/space.jpg" receive_body.baidu.com/receive
    • 注意,这个请求的 receive_body.baidu.com 代表 nginx 服务器
    • 而且,客户端已经配置好 本地 hosts
    • 可以验证,如果文件过大,则会返回 413 Request Entity Too Large
    • 如果没有限制,则正常返回 Proxy OK
  • client_body_temp_path 这个,请求体存到磁盘没有在内存中高效,但是这个需结合业务场景
  • 除了上面,可以打开注释内容,进行其他的测试

http://www.kler.cn/a/280224.html

相关文章:

  • 程序化交易接入怎么样
  • 《黑神话:悟空》霸屏全球,Gooxi喊你一起“直面天命”
  • 山东大数据职称考试复习
  • 对于 OpenAI 最新发布 支持实时语音对话的模型GPT-4o,我想说
  • PTA - C语言国庆题集2
  • 构建高效NLP管道:PydanticOutputParser与Langchain的结合
  • Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz
  • 内网横向移动常用方法
  • 冒泡排序详细说明(内含动态演示图)
  • pg数据库的三种不同数据持久性解读
  • 不可不知的DP协议过往史
  • uniapp中路由的基本使用方法、参数传递方式以及路由拦截与权限控制
  • Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法
  • ensp 中 wlan 的配置过程和示例
  • 2023年最新自适应主题懒人网址导航v3.9php源码
  • Java面试宝典-java基础05
  • KDD2024重磅奖项出炉:“最大奖项”创新奖花落加州大学Lise Getoor,李骏东摘得新星奖
  • 使用密钥文件 SSH 登录服务器:Windows、macOS使用终端或连接工具
  • 【vulhub】Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
  • 在URL链接中指定浏览器跳转到PDF文件的指定页码