`

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

阅读更多

       由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 等常规调试日志跟踪,没发现有价值的信息,也许是我忽略了........
          

       关闭后直接传输:
       

 
           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/

 
  • 大小: 114.4 KB
  • 大小: 84 KB
0
2
分享到:
评论

相关推荐

    Nginx开发指南.pdf

    通过以上概述,我们可以看出《Nginx开发指南》不仅是一份技术文档,更是一份全面深入的技术手册,它不仅介绍了Nginx的基本概念和技术细节,还涵盖了开发实践中的最佳做法,是Nginx开发者不可或缺的参考资料。

    F12调试几个返回值的说明1

    2. **404 Not Found**:404错误意味着服务器找不到处理请求的资源。这可能是URL错误,也可能是服务器部署配置的问题。在确认URL无误后,需要检查Tomcat服务器的部署根目录是否设置为`/webapp`,并确保网页地址的格式...

    nginx进阶vip - 第二课笔记1

    5. **USR2** 信号:用于平滑升级可执行程序,例如在不中断服务的情况下更新Nginx版本。 接下来,我们讨论如何使用 **curl** 在Linux环境中发送HTTP请求并查看返回值,这对于调试和测试Nginx配置非常有用。 **虚拟...

    Nginx1.8.0版本平滑升级新版本1.9.7

    在本文中,我们将详细探讨如何进行Nginx 1.8.0版本到1.9.7版本的平滑升级过程。平滑升级是确保Web服务器在不中断服务的情况下更新软件的重要方法,这对于保持系统安全性和性能至关重要。 首先,确认当前运行的Nginx...

    Lua程序设计.pdf_lua_nginx_

    4. 日志处理:通过Lua脚本收集、分析和处理Nginx的日志,便于监控和优化服务性能。 5. RESTful API开发:使用Lua实现API接口,支持JSON等数据格式,提供RESTful服务。 总之,《Lua程序设计》不仅介绍了Lua语言的...

    详解Keepalived+Nginx实现高可用(HA)

    本文将详细解析如何在 CentOS 7 环境下,通过 Keepalived 和 Nginx 实现服务器之间的负载均衡和故障切换,确保服务的不间断。 Keepalived 是一个基于 VRRP (Virtual Router Redundancy Protocol, 虚拟路由冗余协议)...

    OpenResty-Best-Practices.pdf

    OpenResty是一个基于Nginx和LuaJIT的高性能Web平台,它允许开发者将Lua脚本直接嵌入到Nginx配置中运行,从而提供一个灵活且高性能的Web应用服务器环境。本篇文档旨在介绍OpenResty的最佳实践,涵盖从基础概念到高级...

    详解Spring Boot 2.0.2+Ajax解决跨域请求的问题

    解决跨域请求的方法有多种,包括JSONP、引用A站的JS、Nginx做A站的反向代理、后端服务放开跨域请求等。其中,后端服务放开跨域请求是最常用的方法。 知识点4:Spring Boot中放开跨域请求 在Spring Boot中放开跨域...

    nginx对http请求处理的各个阶段详析

    在这一阶段,Nginx根据请求的URL找到匹配的location配置,这涉及到配置文件中的正则表达式和普通路径的比较。 4. NGX_HTTP_REWRITE_PHASE (URI转换阶段) 这是另一个进行URL转换的阶段,通常用于更复杂的URL重写规则...

    openresty最佳实战

    OpenResty的环境搭建是一个相对复杂的过程,因为需要考虑到不同操作系统的特性。文档中提到了在Windows平台、CentOS平台、Ubuntu平台和Mac OS X平台上的安装方法,这是确保OpenResty应用正常运行的先决条件。 在...

    php-7.0.17

    - **返回类型声明**:允许函数指定返回值类型,增强了代码的类型安全性。 - ** scalar type hints**:支持对int, string, bool和float等基本类型进行类型提示。 - **空合并运算符(??)**:用于在变量不存在或值为...

    前端灰度发布落地方案.docx

    该方案使用 lua 模块解析 nginx 配置文件中的 lua 脚本代码,获取客户端的 ip 地址,去查询 redis 缓存内是否有该建值,如果有返回值执行灰度版本逻辑,否则执行当前生产环境版本。该方案的优点是灵活、可控性强,...

    OpenResty最佳实践-11091810.pdf

    Lua的设计受到了Scheme和Modula的影响,支持过程式编程、面向对象编程和函数式编程等编程范式。 Lua的一个重要特点是它具有可扩展性,支持通过C/C++扩展其功能。LuaJIT是Lua的一个高效解释器版本,它使用即时编译...

    lua openresty

    Lua是一种轻量级的脚本语言,它小巧且功能强大,非常适合嵌入到应用程序中作为扩展脚本语言。在OpenResty中,Lua主要用于编写业务逻辑,处理HTTP请求,以及与Nginx的其他功能模块进行交互。它的动态类型系统、自动...

    终版静态服务器开发文档2

    通过对sendError方法的分析,发现发送错误页面后直接return ANALYSIS_ERROR,这启发开发者在发送目录完成后也使用类似的方式,但为了提高代码可读性,他们将返回值更改为ANALYSIS_DIR_SUCCESS。此外,尝试使用Nginx...

    百汇百通 登录验证demo

    【百汇百通 登录验证demo】是一款演示了如何实现登录验证功能的示例程序,主要针对中文URL乱码和多参数上传与返回值处理等问题提供了完善的解决方案。在这个项目中,我们将深入探讨登录验证的基本原理、中文URL乱码...

    护网面试题总结+DD安全工程师笔试问题

    8. HTTPS 握手过程中用到哪些技术? 知识点:HTTPS 握手过程中使用了 SSL/TLS 协议,包括密钥交换、证书验证、加密和 MAC 验证等技术。 9. Linux 中 PHP 环境,已知 disable_functions=exec,passthrupopen,proc_...

Global site tag (gtag.js) - Google Analytics