首页 > 系统相关 >Nginx图片下载不完整的处理过程

Nginx图片下载不完整的处理过程

时间:2024-06-09 16:11:14浏览次数:29  
标签:body 处理过程 temp nginx buffer 图片下载 Nginx proxy size

Nginx图片下载不完整的处理过程


背景

昨天同事进行了nginx的迁移
然后晚上发现图片展示不全. 
自己其实之前遇到过类似的问题
但是因为熬夜比较久,脑子已经不转了.
所以花了接近半小时才理清楚.
感觉一些事情不记录一下, 无法加深印象.

问题现象

客户的nginx从之前的CentOS迁移到了新机房的银河麒麟v10SP3
基本功能可用,但是比较大的图片就显示不出来了. 
因为当时下午在补觉, 所以上会时间比较晚. 
上会之后看了下问题现场, 因为同期进行了网络切割
所以大家都在讨论网络层的问题. 
自己也一直没插上话.
等到网络问题讨论完, 我这边能插上话后.
让同事帮忙看了下 error log
里面发现了 permission denied的提示
然后很明显就可以定位到时Nginx的权限相关的问题 
跟同事说 可以修改用户 从 nobody 到 root 
或者是可以 修改一下 proxy_temp 的目录权限
都可以解决这个问题. 

同事为了简单, 修改了下 proxy_temp 的目录权限后问题解决. 

其实最初自己遇到过这个问题
也是因为安全加固之后的一些小的兼容性的问题
但是自己当时忘记整理了(因为解决的太畅快了)
以至于这次出问题耗费了半个多小时. 
感觉必须记录一下将原理搞清楚才可以. 

关于nginx的proxy_temp

语法:proxy_buffering on|off
默认值:proxy_buffering on
上下文:http,server,location

作用:该指令开启从后端被代理服务器的响应body缓冲。
    如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,
    并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
    如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
    如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。
    nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
    对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,
    不然异步响应将被缓存导致Comet无法工作。
    但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的

语法:proxy_buffers  数量  size
默认值:proxy_buffers 256 8k
上下文:http,server,location

作用:设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。
    具体的意思是说,开辟256个长度为8k大小的read_buf用来存储body,
    当然不是连接建立初始化时就开辟256个,而是当当前buf不够存响应body时才会新申请一个,最多申请256个buf。

语法:proxy_buffer_size size
默认值:proxy_buffer_size 4k/8k
上下文:http,server,location

作用:Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,
如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。

语法:proxy_temp_path  path [level1 level2 level3]
默认值:proxy_temp_path proxy_temp
上下文:http,server,location
作用:定义proxy的临时文件存在目录以及目录的层级。

proxy_max_temp_file_size
语法:proxy_max_temp_file_size size;
默认值:proxy_max_temp_file_size 1024m;
上下文:http, server, location

关于解决问题的方法

同事用curl的方式高的
发现会在第100KB 进行截断
所以很明显应该是proxy_buffer size的设置.

其实解决问题的思路应该主要有三个:
1. 扩大proxy_buffer的大小. 保证能够在内存里面放的开
优点,性能最好, 缺点不能无限大, 并且会消耗过多的内存. 

2. 修改proxy_temp_path 的目录权限.
可以修改属主, 也可以修改目录权限, 保证nginx的worker进程可以有读写权限.

3. 修改nginx的运行用户.
如果不清楚具体目录,可以修改worker的用户给一个高一点权限的用户
这样也可以解决.

关于性能

一般认为 nginx 作为 proxy 的时候 对磁盘的读写压力不大.
但是在这种情况下, 一个是buffer size 一个是max_body_size
其实还是需要中转到磁盘内的. 

改大buffer区域肯定能够提供一定的性能. 
linux下采用 sendfile 这种COW的方式减少CPU的内存COPY来提高性能
还可以通过gzip 的方式进行 js,css,bmp 等文件格式的压缩
减少网络消耗

其实还可以增加一下内存文件系统. 比如 /dev 后者是 /tmp等
将临时文件放到内存文件系统的目录下.
并且增加特定权限 能够避免磁盘的拖累, 提高nginx的速度

当然前提是内存需要尽量大一点.
吃饱了的马才能使千里马. 

标签:body,处理过程,temp,nginx,buffer,图片下载,Nginx,proxy,size
From: https://www.cnblogs.com/jinanxiaolaohu/p/18239651

相关文章

  • nginx快速分析日志并找出攻击IP
    第一步:分析NGINX日志分析日志主要目的是寻找那些异常活跃的IP地址,通过以下命令可以快速找出。 cataccess.log|awk'{print$1}'|sort|uniq-c|sort-rn|head-10命令说明:cataccess.log:将access.log文件的内容输出到标准输出。awk'{print$1}':awk是一个强大的文本......
  • 从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?
    前言大家好,我是老马。很高兴遇到你。作为一个java开发者,工作中一直在使用nginx。却发现一直停留在使用层面,无法深入理解。有一天我在想,为什么不能有一个java版本的nginx呢?一者是理解nginx的设计灵魂,再者java开发者用java语言的服务器不是更加自然吗。于是......
  • 从零手写实现 nginx-11-文件处理逻辑与 range 范围查询合并
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • Spring Boot、MongoDB、Vue 2和Nginx实现一个小说网站
    在本篇文章中,我们将带你逐步实现一个完备的小说网站项目,技术栈包括SpringBoot、MongoDB、Vue2和Nginx。1.项目概述我们将实现一个基本的小说网站,包含以下主要部分:后端API:使用SpringBoot实现,负责处理数据和业务逻辑。数据库:使用MongoDB存储小说数据。前端页面:使用Vue2实......
  • centos 环境 nginx 安装及常用命令简介
    一、引言Nginx是一个高性能的HTTP和反向代理服务器,因其卓越的性能、丰富的功能集、简单的配置和低资源消耗而广受欢迎。本文将详细介绍如何在CentOS系统中安装Nginx,并简要介绍一些常用的Nginx命令。二、在CentOS中安装Nginx1.先检查服务器GCC环境是否安装gcc-v2.......
  • Nginx访问日志
         Nginx日志是NginxWeb服务器产生的记录文件,主要用于跟踪和分析服务器的访问情况以及错误信息。Nginx日志主要分为两大类:访问日志(access_log):访问日志记录了每一次客户端对Nginx服务器的HTTP请求的详细信息,这对于统计分析、流量监控、用户行为分析等非常有用......
  • nginx监控
    1.监控nginx链接数状态status#1.开启status页面功能cat>/etc/nginx/conf.d/status.conf<<'EOF'server{listen80;server_namelocalhost;location/nginx_status{stub_statuson;access_logoff;}}EOF#2.访问测试[r......
  • nginx的负载均衡方式
    Nginx是一种高性能的HTTP和反向代理服务器,它具有强大的负载均衡功能。Nginx支持多种负载均衡策略,包括轮询、权重轮询、最少连接、IP哈希等。1.轮询(RoundRobin)轮询是Nginx的默认负载均衡方式,它将请求依次分配给每个后端服务器。配置:http{upstreamweb{ser......
  • 利用WinSW将Nginx 作为可正常启动/停止的windows服务
    下载winsw程序,Releases·winsw/winsw(github.com)将下载的exe文件放置到nginx.exe的同级目录,名字可以修改为nginx-service.exe(也可不修改)新建txt文本文档,并将其名称改为winsw程序一模一样的名称(不包含.和后缀),填写如下内容1<service>2<id>nginx</id>3<......
  • Nginx 配置防护 缓慢的 HTTP拒绝服务攻击+点击劫持:X-Frame-Options未配置
    一安全团队检测网站1 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。慢速HTTP拒绝服务攻击经过不断的演变和发展......