首页 > 其他 > 详细

nginx 取不到返回值的分析过程

时间:2016-02-27 02:09:15      阅读:531      评论:0      收藏:0      [点我收藏+]

? ? ? ?由nginx负载遇到一个取不到返回值的问题:

? ??? ? ?第一步先put,状态码:200 "PUT /api/execut
? ? ? ? ?第二步get返回值,状态码:500 "GET /api/preview?
? ? ? ??我尝试过解决办法:
? ? ? ? ? ?1.试不同的配置方法
? ? ? ? ? ?1.1 配置通用的匹配
? ? ? ? ? ? ? ? location / {
? ? ? ? ? ? ? ? ?}
? ? ? ? ?1.2: ?根据上下
? ? ? ? ? ? ? ? ?location /app
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? location /api {? ? ?
? ? ? ? ? ? ? ?}
? ? ? ? ? ?2.tengine2.2 与nginx1.9.2 版本对比,返回结果还是一样
? ? ? ? ? 3.用了charles抓包,看到get的数据回来了,nginx却取不到,返回500状态码
? ? ? ? ? ?4.tenginx 打开debug,error 等常规调试日志跟踪,没发现有价值的信息,也许是我忽略了........
? ? ? ? ??
bubuko.com,布布扣
? ? ? ?关闭后直接传输:
? ? ? ?
bubuko.com,布布扣
?
? ? ? ? ? ?5.看源码.......
? ? ? ? ? 这问题很少见,折腾了两天,最后是定位出nginx这层配置的问题,但不知道原因在哪。最后竟是nginx 的buffer原因。
? ? ? ? ? 设置proxy_buffering off
? ? ? ? ? 具体原因是nginx 为每个请求设置buffer ,一个请求对应条buffer,而这里程序a发出请求,建立了一个buffer_a,同时程序里又写新加一条请求b,返回值在buffer_b里,这时前端在等着buffer_a数据,而buffer_a是没有这条数据的,在buffer_b呢。
? ? ? ? ?so ,对于这种情况最直接的办法就是关闭proxy_buffer off. ? ?
? ? ? ??相关参数
proxy_buffer_size

语法: proxy_buffer_size the_size

默认值: proxy_buffer_size 4k/8k

上下文: http, server, location

? ? ? ? ?该指令设置缓冲区大小,从代理后端服务器取得的第一部分的响应内容,会放到这里.小的响应header通常位于这部分响应内容里边.默认来说,该缓冲区大小等于指令 proxy_buffers所设置的;但是,你可以把它设置得更小.

proxy_buffering

语法: proxy_buffering on|off

默认值: proxy_buffering on

上下文: http, server, location

? ? ? ? ?该指令开启从后端被代理服务器的响应内容缓冲.如果缓冲区开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令proxy_buffer_size 和 proxy_buffers指定的缓冲区里边.如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。如果缓冲区被关闭了,那么响应内容会按照获取内容的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.

? ? ? ? ? ?对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作

proxy_buffers

语法: proxy_buffers the_number is_size;

默认值: proxy_buffers 8 4k/8k;

上下文: http, server, location

? ? ? ? ?该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。

proxy_busy_buffers_size

语法: proxy_busy_buffers_size size;

默认值: proxy_busy_buffers_size proxy_buffer_size * 2;

上下文: http, server, location, if

TODO: Description.

buffer工作原理

? ? ? 首先第一个概念是所有的这些proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。

proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。

无论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。

? ? ? ? ?一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的。

http://www.ioutlier.com/nginx-proxy-buffer-works/

?

nginx 取不到返回值的分析过程

原文:http://hugoren.iteye.com/blog/2279083

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!