搜索

首页  >  问答  >  正文

nginx 关于 proxy_pass 重试的问题

各位大神,我的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超时问题的,也非常感谢啊~

高洛峰高洛峰2749 天前857

全部回复(1)我来回复

  • 给我你的怀抱

    给我你的怀抱2017-05-16 17:25:48

    You asked for one try, then nginx tries that once.

    try 和 retry 是不同的。你 proxy_next_upstream_tries 2; 试试。另外你似乎也误解了 proxy_next_upstream_timeout 的意思。把它也去掉。

    回复
    0
  • 取消回复