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

关于 proxy_pass 重试的问题

  •  
  •   yuankui · 2015-06-17 23:14:07 +08:00 · 3488 次点击
    这是一个创建于 3451 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位大神,我的nginx会通过proxy_pass去调tomcat,但是tomcat会间歇性抽风(fullgc)导致超时,7-8秒吧

    我想了一个办法就是请求第一次的时候设置一个超时时间,比如说1s,如果超时了,就在请求一次(换一台机器)

    然后我就有了下面这个nginx配置.(下面是用flask的sleep模拟tomcat的fullgc)

    upstream up {
    server 127.0.0.1:8088;
    server 127.0.0.1:8089;
    }

    server {
    listen 8087;
    server_name localhost;
    access_log logs/host.access.log main;

    location / {
    proxy_connect_timeout 1s;
    proxy_send_timeout 1s;
    proxy_read_timeout 1s;

    proxy_next_upstream_timeout 1s;
    proxy_next_upstream_tries 1;
    send_timeout 1s;
    proxy_next_upstream timeout error;
    proxy_pass http://up;
    }
    }

    8088和8089的服务是我用写的一个mock服务
    8088会直接睡秒2s,导致nginx超时
    8089会直接返回一个"hello world",200

    我的期望是
    当我用命令行 `curl`反复请求8087的时候,会始终返回 "hello world",虽然有些请求比较快,有些请求比较慢(1s多,因为经过了一次超时请求之后重新进行的请求)

    但是结果却并不是这样

    当请求超过1s后,8087他就直接返回 504错误了


    通过查看nginx后台日志:
    连续打印了3条超时记录:



    但是8088(sleep的那个服务,)仅仅只收到了一个请求(有些小异常,用flask写的)



    然后我用wireshark抓包发现




    求助各位大神?
    我的配置哪里有问题吗??

    这里可能提提供了些无关信息,如果没用可以忽略哈~

    如过有其他好的处理tomcat fullgc超时问题的,也非常感谢啊~
    第 1 条附言  ·  2015-06-18 10:32:01 +08:00
    原因找到了

    proxy_next_upstream_tries 1; 这个配置的问题

    我的理解是next upstream tries的前提是第一次已经fail了,然后额外的重试次数

    当这个tries的实际意思是总的重试次数~

    真sad...
    10 条回复    2015-06-19 23:57:48 +08:00
    GeekGao
        1
    GeekGao  
       2015-06-18 00:28:38 +08:00
    504 Gateway Time-out 的问题是由于你python的应用(这里是你的mock)导致的。其意是:所请求的网关没有请求到。这个问题不算是nginx配置问题。具体还要看你flask那边是怎么搞的,用uwsgi部署的还是什么其他的方式?
    GeekGao
        2
    GeekGao  
       2015-06-18 00:31:52 +08:00
    用uwsgi部署你的flask mock试试
    ryd994
        3
    ryd994  
       2015-06-18 00:34:03 +08:00 via Android
    @GeekGao 不是的,如果是上游返回的504的话,Nginx log里是不一样的记录
    GeekGao
        4
    GeekGao  
       2015-06-18 00:40:23 +08:00
    @ryd994 额 504是nginx抛出的,上游(flask?tineout了都还木有运行完或遇到exception挂了)表示很无辜
    ledzep2
        5
    ledzep2  
       2015-06-18 00:51:30 +08:00
    我建议你先试下把这个去了 proxy_next_upstream_timeout 1s; 然后再试下吧read_timeout加大
    yuankui
        6
    yuankui  
    OP
       2015-06-18 09:27:05 +08:00
    @GeekGao 应该不是flask的问题,你看下flask的日志,flask是返回200的,之所以出现 `Broken Pipe`这种异常,是因为nginx认为超时了,flask还没有返回,然后就主动断开连接了,注意wireshark第5行那个FIN.

    flask我是裸跑的,就是试试你说的uwsgi的方式部署一下~
    yuankui
        7
    yuankui  
    OP
       2015-06-18 09:27:43 +08:00
    @ledzep2 我这个配置最早是很干净的,这个是反复尝试之后加上的,不过还是没有达到预期效果~
    GeekGao
        8
    GeekGao  
       2015-06-18 10:24:12 +08:00
    @yuankui 所以还是你部署flask时候的问题,flask执行时间过长 or 发生了错误
    yuankui
        9
    yuankui  
    OP
       2015-06-18 10:36:07 +08:00
    @GeekGao 哈哈,不是的,客户端跟服务端打电话说,`把这个响应告诉我`,服务端说好的
    但是等了一秒还没 服务端那边都没有声音,于是客户端就把电话挂了
    过了2秒之后,服务端说,我找到了!,但是发现客户端已经把电话挂了,于是说了声,"居然挂我电话!"

    问题找打了,见append..
    ledzep2
        10
    ledzep2  
       2015-06-19 23:57:48 +08:00
    @yuankui 恭喜. 一起学习了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:05 · PVG 05:05 · LAX 13:05 · JFK 16:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.