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
- 语法:proxy_request_bufering on | off;

- 配置成 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 这个,请求体存到磁盘没有在内存中高效,但是这个需结合业务场景
- 除了上面,可以打开注释内容,进行其他的测试