Nginx缓冲区

问题回顾

近日,我们一个版本的分支上了预发,一个订单查询接口总是报错,后端服务器日志大概如下

ClientAbortException  Caused by: java.net.SocketException: Connection reset by peer: socket write error

一开始排查问题的方向肯定是后端出错了,但是看这个完整的异常栈,出错报在框架层,和业务代码无关,怀疑的方向就是后端数据量太大

然后通过抓包,发现每次前端报错的时候,那个http返回报文中body里的json被截断了,只有一部分,这时候就有点怀疑nginx了,毕竟这个请求是nginx代理请求的,极有可能nginx哪里配置出错了


那么就进服务器看nginx error日志,看到了如下日志

[crit] 17201#0: *58771 open() "/usr/local/nginx//proxy_temp/8/65/0000000658" failed (13: Permission denied) while reading upstream, client: 10.111.42.228, server: ys.test.
51juban.cn, request: "GET /order/index?verson=20170925 HTTP/1.1", upstream: "[http://10.111.12.42:9102/order/index?verson=20170925](http://10.111.12.42:9102/order/index?verson=20170925)", host: "ys.test02.51juban.cn", referrer: "[http://ys.test02.51juban.cn/frame/](http://ys.test02.51juban.cn/frame/)"

把/usr/local/nginx目录的权限设置为nginx,让nginx进程能够访问就行了,返回报文被截断的情况就再也没发生了,疯狂吐槽的App开发哥们终于能够测试了。

这个问题阻碍测试接近1天,调查问题进度也没上面写的那么顺风顺水,我觉得遇到问题首先要合理分析出问题出在哪里,问题的初期其实我经过百度,其实和运维提过排查下nginx日志



这个虽然加错了,凡是方向对了,如果看了nginx日志,应该能立刻解决问题,但是没有看,我也没那台服务器权限
第二天,我们抓包了,发现返回被截断,我更加怀疑nginx的问题



嗯,这次对了

一个小小的点,阻碍了这么多时间,这么多人力,可见细节决定成败,以及经验的重要性

所以以后遇到问题

  1. 合理分析问题原因
  2. 看日志,看日志,看日志
  3. 团队合作

出现这个问题的原因就是nginx对它的缓冲区目录没有权限,下面我们就来学习下这个缓冲区

缓冲区的作用

缓冲区的作用,就是为了协调客户端到nginx以及nginx到服务器的速度不同。如果这两条链路都非常快,那么没有缓冲区的事了。
如果客户端到nginx速度快,nginx到服务器速度慢,没有缓冲区,一点点数据量就直接发到客户端,十分浪费性能。有了缓冲区,积累到一定量,再传输到客户端,减少了Tcp请求。
相反,客户端到nginx速度慢,nginx到服务器速度快,没有缓冲区,nginx到服务器的连接就会一直保持在那边,直到客户端接受完毕。有了缓冲区,返回内容放到缓冲区后,nginx到服务器的连接就能断开了,客户端从缓冲区拉取即可。

缓冲区这个概念在很多地方都用到,你想到了那些地方?IO?MQ?

nginx缓冲区配置

nginx缓冲区的配置主要在location模块下面,主要配置参数如下

proxy_buffer_size

后端服务器的相应头会放到proxy_buffer_size当中,这个大小默认等于proxy_buffers当中的设置单个缓冲区的大小。 proxy_buffer_size只是响应头的缓冲区,没有必要也跟着设置太大。 proxy_buffer_size最好单独设置,一般设置个4k就够了。

proxy_buffers


proxy_buffers的缓冲区大小一般会设置的比较大,以应付大网页。 proxy_buffers当中单个缓冲区的大小是由系统的内存页面大小决定的,Linux系统中一般为4k。 proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。

若某些请求的响应过大,则超过_buffers的部分将被缓冲到硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验. 可以使用proxy_max_temp_file_size指令关闭磁盘缓冲.

proxy_busy_buffers_size

proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。

proxy_max_temp_file_size和proxy_temp_file_write_size

临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size这两个指令决定。 proxy_temp_file_write_size是一次访问能写入的临时文件的大小,默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍,Linux下一般是8k。

proxy_max_temp_file_size指定当响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小. 如果超过了这个值, Nginx将与Proxy服务器同步的传递内容, 而不再缓冲到硬盘. 设置为0时, 则直接关闭硬盘缓冲.

缓冲区分为内存和文件两部分,不可能所有Response都在内存中缓冲,毕竟需要用内存去建立更多连接,所以超过一定的量会刷到磁盘,我们出现的问题就是刷到磁盘这一步被权限阻碍了,导致客户端拿到的部分报文是内存中的

但是我们的Response并不是全部被截断,百分之60的Response是正常的,我猜测要么是这些Response没有超过缓冲区大小,要么写的缓冲目录部分存在权限

注意下上面的默认配置,缓冲区是默认开启的

nginx缓冲区使用

默认的配置应该够用,也可以根据应用平均的Response大小做优化,毕竟直接走内存肯定要比走IO快

参考的文章
https://www.cnblogs.com/me115/p/5698787.html
https://www.cnblogs.com/bethal/p/5606062.html
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269