ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 接收包体两种方式 nginx对于客户端的请求发送给上有服务器是如何做的? 1. 接收完全部包体再发送; 2. 一边接收,一边发送; ## 相关指令 1. proxy_request_buffering; 2. client_max_body_size; 3. client_max_buffer_size; ## proxy_request_buffering 语法: ``` proxy_request_buffering on | off ``` 默认值: ``` proxy_request_buffering on; //设为on,nginx完全接收包体后再发送给上游服务器; ``` 上下文: ``` http | server | location ``` ### 开启(on)的情况: 设为off的话,nginx需要和上游服务器不停的建立大量的连接和请求,对于上游服务器的压力较大; 1. 对吞吐量要求高; 2. 上游服务并发处理能力低; ### 关闭的情况 如果将buffering关闭的话,那么对于客户端的响应速度就会更快,并且减少nginx的磁盘IO,因为不需要将请求缓存起来;并且buffering的容量是有限的,当超过这个容量后,nginx会将请求存储到磁盘上; 1. 更及时的响应; 2. 减少nginx磁盘IO; ## client_max_body_size 这个决定了nginx可以处理的请求体的大小,这个参数需要特别注意,如果需要上传文件或者图片需要将这个参数调大,否则大于这个体量无法上传的; 语法: ``` client_max_body_size size; ``` 默认值: ``` client_max_body_size 1M; ``` 上下文: ``` http | server | location ``` ## client_max_buffer_size 这个就是对应前面的buffering的大小; 语法: ``` client_max_buffer_size size; ``` 默认值: ``` client_max_buffer_size 8k | 16k; ``` 上下文: ``` http | server | location ``` ## 场景实践 请求体小于client_max_body_size: ![](https://img.kancloud.cn/48/bc/48bc0035a204191f506a74d212d96037_2814x1314.png) 请求体大于client_max_body_size: ![](https://img.kancloud.cn/d7/3a/d73ae4c20d511ec221a86d62bf2a04cd_2696x1296.png) 请求体小于client_max_body_size但是使用client_body_temp_path指定了临时存储目录: ![](https://img.kancloud.cn/17/c4/17c4e4499c2bcf21825a5cf230ca7515_2774x1236.png) ## client_body_in_single_buffer 如果是on,那么请求体会存放在缓冲区连续的区域;这样读取会更快; 语法: ``` client_body_in_single_buffer on | off; ``` 默认值: ``` client_body_in_single_buffer off; ``` 上下文: ``` http | server | location ``` ## client_body_temp_path 当请求体大于设定的请求体的容量,那么就会存放到设定的目录中; 语法: ``` client_body_temp_path path [level1] [level2] [level3]; ``` 默认值: ``` client_body_temp_path client_body_temp; ``` 上下文: ``` http | server | location ``` ## client_body_in_file_only 当这个值设为on,不管请求体大于还是小于缓冲区都会存放到磁盘上;请求完成后不删除;如果选择clean,也会存放磁盘上,但是请求完成后会删除; 语法: ``` client_body_in_file_only on | clean | off; ``` 默认值: ``` client_body_in_file_only off; ``` 上下文: ``` http | server | location ``` ## client_body_timeout 当客户端和nginx建立连接后长时间没有发送请求体,就会关闭连接; 语法: ``` client_body_timeout time; ``` 默认值: ``` client_body_timeout 60s; ``` 上下文: ``` http | server | location ``` ## 实例 ``` location /receive/ { proxy_pass http://back_end; client_max_body_size 100k; //客户端最大请求体大小 client_body_buffer_size 250k; client_body_temp_path test_body_path; //配置完成后nginx会自动创建test_body_path这个文件夹 client_body_in_file_only on; client_body_in_sigle_buffer on; proxy_request_buffering on; client_body_timeout 30; } ```