Nginx 反向代理图
- 当用户发过来一个request body的时候,Nginx 是如何处理这样一个body
- 这个body 它对应的就是我们客户请求的一些具体内容
1 )proxy_request_bufering 指令
- 接收包体的两种方式
- 接收完全部包体再发送
- 一边接收包体一边发送
- 接收包体的两种方式切换的相关指令
- 配置成 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 测试