美文网首页
Nginx 504 Gateway Time-out/xxxx方

Nginx 504 Gateway Time-out/xxxx方

作者: 上下而求索 | 来源:发表于2021-04-25 17:43 被阅读0次

    注:除了f12,日志等。不要相信任何弹窗。。
    问题描述:接到用户反馈,弹窗提示文件导入失败
    解决途径:
    1、拿到用户账号密码及相关excel后,还原业务操作,f12发现报错信息504 Gateway Time-out/xxxx
    2、nginx504超时,查看tomcat日志,根据业务定位日志
    业务开始:


    Snipaste_2021-04-25_17-04-28.png

    业务结束:


    Snipaste_2021-04-25_17-06-11.png

    所用时间:大约为2min

    3、查看nginx默认超时时间
    proxy_connect_timeout
    语法: proxy_connect_timeout timeout_in_seconds
    上下文: http, server, location
    This directive assigns a timeout for the connection to the proxyserver. This is not the time until the server returns the pages, this is the [#proxy_read_timeout proxy_read_timeout] statement. If your proxyserver is up, but hanging (e.g. it does not have enough threads to process your request so it puts you in the pool of connections to deal with later), then this statement will not help as the connection to the server has been made. It is necessary to keep in mind that this time out cannot be more than 75 seconds.
    该指令为到 代理服务器的连接分配一个超时。这不是服务器返回页面的时间。如果 代理服务器 已经启动,但是挂起了(例如,它没有足够的线程来处理您的请求,因此它将您放在连接池中,以便以后处理) ,那么这条语句将不会有任何帮助,因为已经建立了与服务器的连接。有必要记住,这个超时时间不能超过75秒。
    注:这个应该是建立三次握手连接时间,设置不能超过75S

    proxy_send_timeout
    语法: proxy_send_timeout time_in_seconds
    默认值: proxy_send_timeout 60
    上下文: http, server, location
    This directive assigns timeout with the transfer of request to the proxy server. Time out is established not on entire transfer of request, but only between two operations of record. If after this time the proxy server will not take new data, then nginx is shut the connection
    个人理解:有错请指出。
    该指令通过向代理服务器传输请求来分配超时时间。超时不是在整个请求传输上建立的,而是仅在两个请求操作之间建立的。如果在此之后代理服务器将不接受新数据,那么 nginx 将关闭连接。(比如文件上传,60s内没把数据传给upstram)

    proxy_read_timeout
    语法: proxy_read_timeout the_time
    默认值: proxy_read_timeout 60
    上下文: http, server, location
    This directive sets the read timeout for the response of the proxied server. It determines how long NGINX will wait to get the response to a request. The timeout is established not for entire response, but only between two operations of reading.
    In contrast to [#proxy_connect_timeout proxy_connect_timeout] , this timeout will catch a server that puts you in it's connection pool but does not respond to you with anything beyond that. Be careful though not to set this too low, as your proxyserver might take a longer time to respond to requests on purpose (e.g. when serving you a report page that takes some time to compute). You are able though to have a different setting per location, which enables you to have a higher proxy_read_timeout for the report page's location.
    If the proxied server nothing will communicate after this time, then nginx is shut connection.
    此指令设置代理服务器响应的读取超时。它确定 NGINX 将等待多长时间才能得到请求的响应。超时不是针对整个响应设置的,而是仅在两个读取操作之间设置的。
    与[ # proxy connect timeout proxy proxy connect timeout ]相反,这个超时将捕获一个服务器,它将把你放入它的连接池,但除此之外不会对你做出任何响应。不过要小心,不要设置得太低,因为 proxyserver 可能需要更长的时间故意响应请求(例如,当为您提供一个需要花费一些时间进行计算的报告页面时)。不过,您可以为每个位置设置一个不同的设置,这样就可以为报表页面的位置设置更高的代理读取超时。
    如果被代理的服务器在这个时间之后没有任何东西进行通信,那么 nginx 关闭连接。60s内没从upstream读到任何数据。两台负载情况下,默认容错机制表现给浏览器就是120s返回504。只针对GET生效,针对POST请求,需要增加 non_idempotent

    容错参数:
    句法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
    默认:
    proxy_next_upstream 错误超时;
    语境: http, server,location
    指定在哪些情况下应将请求传递到下一个服务器:

    error
    与服务器建立连接、向其传递请求或读取响应头时发生错误;
    timeout
    与服务器建立连接、向其传递请求或读取响应标头时发生超时;
    invalid_header
    服务器返回空或无效的响应;
    http_500
    服务器返回代码为 500 的响应;
    http_502
    服务器返回代码为 502 的响应;
    http_503
    服务器返回代码为 503 的响应;
    http_504
    服务器返回代码为 504 的响应;
    http_403
    服务器返回代码为 403 的响应;
    http_404
    服务器返回代码为 404 的响应;
    http_429
    服务器返回代码为 429 (1.11.13) 的响应;
    non_idempotent
    通常,如果请求已发送到上游服务器 (1.9.13) ,则使用 非幂等 方法 ( POST, LOCK, PATCH) 的请求不会传递到下一个服务器;显式启用此选项允许重试此类请求;
    off
    禁止将请求传递到下一个服务器。
    应该记住,只有在尚未向客户端发送任何内容的情况下,才能将请求传递到下一个服务器。也就是说,如果在传输响应的过程中发生错误或超时,则无法修复此问题。

    该指令还定义了与服务器通信的 失败尝试。的情况下error,timeout并 invalid_header始终被认为不成功的尝试,即使在该指令中没有指定他们。的情况下http_500,http_502, http_503,http_504,和http_429被认为只有当他们在该指令中指定不成功的尝试。的情况下,http_403和http_404 永远不会被视为不成功的尝试。

    将请求传递到下一个服务器可能会受到 尝试次数 和时间的限制。

    句法: proxy_next_upstream_timeout time;
    默认:
    proxy_next_upstream_timeout 0;
    语境: http, server,location
    该指令出现在 1.7.5 版中。

    限制请求可以传递到 下一个服务器的时间。该0值关闭此限制。

    句法: proxy_next_upstream_tries number;
    默认:
    proxy_next_upstream_tries 0;
    语境: http, server,location
    该指令出现在 1.7.5 版中。

    限制将请求传递到下一个服务器的可能尝试次数 。该0值关闭此限制。

    2min是超过了默认60s的,所以会报504

    根据业务量设置:

    相关upstream配置
    proxy_send_timeout 500;
    proxy_read_timeout 480;

    nginx中文文档:
    1、https://www.nginx.cn/doc/
    2、https://www.nginx.cn/nginx-how-to
    nginx官网文档:
    1、http://nginx.org/en/docs/

    相关文章

      网友评论

          本文标题:Nginx 504 Gateway Time-out/xxxx方

          本文链接:https://www.haomeiwen.com/subject/hnodrltx.html