V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
iyaozhen
V2EX  ›  NGINX

nginx keepalive 502 问题

  •  1
     
  •   iyaozhen ·
    iyaozhen · 2018-10-17 17:18:41 +08:00 · 4372 次点击
    这是一个创建于 2230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    服务使用的是 nginx + tomcat

    最近发现偶现 502

    错误日志:

    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 http upstream process header
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 malloc: 00007FB65E3834E0:4096
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 posix_memalign: 00007FB65C783D60:4096 @16
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 recv: eof:1, avail:1
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 recv: fd:65 0 of 4096
    2018/10/17 01:31:05 [error] 46093#46093: *606728052 upstream prematurely closed connection while reading response header from upstream, clien
    t:xxx
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 http next upstream, 2
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 free keepalive peer
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 free rr peer 4 4
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 free rr peer failed: 00007FB65C704F50 1
    2018/10/17 01:31:05 [debug] 46093#46093: *606728052 finalize http upstream request: 502
    

    看了下 nginx 代码,发现是 c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last); 读到的内容为 0,日志中也有显示recv: fd:65 0 of 4096,一开始就读不到(查了 tomcat 日志,请求还没到 tomcat )

    https://github.com/nginx/nginx/blob/1305b8414d22610b0820f6df5841418bf98fc370/src/http/ngx_http_upstream.c#L2366

    怀疑是各种原因导致建立的这个长链接断掉了。试着把 keeplaive 去掉就好了。但是这个会影响性能,不知道大家怎么解决这个问题?

    还有人可能会问为什么没有重试,那是因为 proxy_next_upstream 只设置了 error、timeout,没有设置 non_idempotent (这是个 POST 请求)

    9 条回复    2018-10-18 12:21:33 +08:00
    lujjjh
        1
    lujjjh  
       2018-10-17 20:28:37 +08:00
    不知道是不是类似的情况: https://codehut.me/posts/Y3Vyc29yOjM1

    可以尝试调高 Tomcat 的 keepAliveTimeout (连接可控的话甚至设成 -1 ),或者调低 nginx 的 keepalive_timeout。

    https://tomcat.apache.org/tomcat-8.5-doc/config/http.html
    https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive_timeout
    iyaozhen
        2
    iyaozhen  
    OP
       2018-10-17 20:53:18 +08:00
    @lujjjh 我刚也怀疑到这里了。已经把线上 tomcat 都改完了,明天观察下。感觉要破案了
    salmon5
        3
    salmon5  
       2018-10-17 20:59:00 +08:00
    proxy_read_timeout 60;
    默认 60 秒,可以调大一些。
    iyaozhen
        4
    iyaozhen  
    OP
       2018-10-17 21:32:27 +08:00 via Android
    @salmon5 这个之前考虑过,统计看 tomcat 处理的很快,也都是内网。暂时还是默认值
    salmon5
        5
    salmon5  
       2018-10-17 21:47:57 +08:00
    proxy_http_version 1.0 或注释 proxy_http_version 1.1,
    用 http 1.0 短链接,性能其实没有那么不堪,tps 几百以内 http1.0 没影响的,
    tomcat 过早异常关闭连接,nginx 不知道,直接请求没有三次握手,请求不到 tomcat,502。
    zhangZMZ
        6
    zhangZMZ  
       2018-10-18 09:48:08 +08:00
    在当庭宣判的那一刻,服务器立马崩溃。
    leader、上级 leader、boss、下属以及吃瓜群众集体视线聚焦在你身上,那一刻你是万众瞩目的焦点,
    iyaozhen
        7
    iyaozhen  
    OP
       2018-10-18 11:36:14 +08:00
    @lujjjh 是这个原因。nginx 设置的是 120s,tomcat 默认使用 connect timeout 20s。
    老哥 稳
    iyaozhen
        8
    iyaozhen  
    OP
       2018-10-18 11:37:41 +08:00
    @salmon5 嗯嗯,短链接肯定没问题。主要是想知道原因
    salmon5
        9
    salmon5  
       2018-10-18 12:21:33 +08:00 via Android
    @iyaozhen 这就是我都是主张配置 web 服务器和应用服务器短链接的原因,你这个又是个案例😄
    应用服务器长链接还有一些其他问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1081 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:30 · PVG 02:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.