Nginx 504 Gateway Time-out的两种最新解决方案

目录
  • 背景:
  • 问题:
  • 504从哪来:本文的场景下504是nginx返回的。
  • 两种解决方案
  • 其他问题:
  • 总结

背景:

Nginx做反向代理,springboot为后端服务。

问题:

通过浏览器向后台发起请求够,由于后台处理时间长,出现504 Gateway Time-out,实际后台程序依然在执行。如何解决?

504从哪来:本文的场景下504是nginx返回的。

nginx配置中控制该超时时间的属性:

Syntax: proxy_read_timeout time;
Default:
proxy_read_timeout 60s;
Context: http, server, location

官方地址:Module ngx_http_proxy_module (nginx.org)

官方描述如下:Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.

一个请求有三方参与:浏览器,nginx,后台服务器。

504的错误码是有nginx返回的。结合官网的解释,我们可以得出结论:

当nginx与后台的链接两次读取有效数据之间超过配置的时间时,就会产生504超时。nginx会主动关闭与后台服务器的链接。注意是两次成功读取的间隔,不是整个reponse的时间。

默认情况下proxy_read_timeout时60s。

如果你百度或google,通常解决方式有两种:提高后台处理效率增大proxy_read_timeout

增大方法很简单,proxy_read_timeout  [你期望的时间]。

But,后台效率提升总是有极限的。而proxy_read_timeout是固定值。总会有些正常业务场景,超过了设置的timeout值。

两种解决方案

本人解决的问题:上传excel文件后,由于文件大小无法预计,所以后台处理时间也无法预计。同时还要支持大文件的上传。上传后由后台解析处理。post请求,返回的是json。

一,关闭read-timout,可以实现,但是生产环境下你敢不设置超时时间么?所以不建议。

二,既然nginx只要从reponse成功读取数据两次的间隔在proxy_read_timeout设置的时间内,就不会超时。那么我们是不是可以通过持续的向response中写入数据来保证不超时呢。

答案是肯定的。

想通了这一点,实现就十分简单。

1,正常上传文件。

2,新建一个线程。持有response的引用,含有标志位,满足条件时循环执行,程序开始处理数据前,启动线程。

3,线程的功能只有一个,以固定间隔向response中写入数据。使nginx与后台链接不超时。

4,这里就需要注意,我的方法是返回json,同时要持续向response写入数据,所以我手动拼装json字符串。相当于在之前返回的json中增加一个属性,名称随意,我的叫pending,值随意,非空即可。我是用英文半角的句号" . "。

5,数据处理完后,回调线程的stop方法,终止线程中的循环。

注意:如有雷同纯属巧合。如果已经有大佬讲过这种解决方式,请艾特我,我立即删除本文。

保持线程代码如下:

#上下文代码
//获取鲜橙池executor,具体方式看个人。不会的直接百度,有很多
response.setContentType(ContentType.APPLICATION_JSON.getMimeType());
ResponseKeeper responseKeeper = new ResponseKeeper(response);
executorService.execute(responseKeeper);
#上下文代码

public class ResponseKeeper implements Runnable {

        /**
        * 循环标志:true时停止循环,终止线程
        */
        private boolean done = false;

        private HttpServletResponse response;

        public void stop(){
            done = true;
        }

        public ResponseKeeper(HttpServletResponse response) {
            this.response = response;
        }

        @Override
        public void run() {
            try {
                response.getWriter().write("{\"pending\":\"");
                while(!done){
                    response.getWriter().write(".");
                    response.getWriter().flush();
                    LOGGER.error("flush-{}", System.currentTimeMillis());
                    Thread.sleep(1000);
                }
                response.getWriter().write("\", \"status\": \"0\", \"msg\":\"success\"}");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

其他问题:

如果你遇到异常

IllegalStateException – if the getOutputStream method has already been called for this response object

那就说明你的程序中有地方调用过了,response.getOutputStream();

只需要与已有程序保持一致使用outputStream即可。

即将response.getWriter() 提换成 response.getOutputStream();

原因简单来讲就是这两个方法互斥。调用了一个就不能调用另一个。

总结

到此这篇关于Nginx 504 Gateway Time-out的两种解决方案的文章就介绍到这了,更多相关Nginx 504 Gateway Time-out内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • LNMPA遇到504 Gateway time-out错误的解决方法

    Nginx的特点是处理静态很给力,Apache的特点是处理动态很稳定,两者结合起来便是LNMPA,nginx处理前端,apache处理后端,这样处理静态会很快,处理动态会很稳定. 当我以为安装完成以后便万事大吉,不料更新网站的时候却出现504 Gateway time-out;起初还以为这是偶然,多次尝试后依然出现这样的情况,因此才决定查找解决方法. LNMP面对504 Gateway time-out 因为504 Gateway time-out是Nginx的专属错误,因此起初我以为是ngin

  • 解决nginx“504 Gateway Time-out”错误

    做网站的同学经常会发现一些nginx服务器访问时候提示504 Gateway Time-out错误,一般情况下是由nginx默认的fastcgi进程响应慢引起的,但也有其他情况,这里我总结了一些解决办法供大家参考. 如何解决"504 Gateway Time-out"错误 方法/步骤 情况一:由于nginx默认的fastcgi进程响应缓冲区太小造成 这种情况下导致fastcgi进程被挂起,如果fastcgi服务队这个挂起处理不是很好的话,就可能提示"504 Gateway T

  • 一次nginx 504 Gateway Time-out错误排查、解决记录

    记一次莫名其妙的网站失去响应排查.之前网站一直是使用nginx做代理后端的apache运行php来提供服务.apache经常会不定期不定时间的出现不能服务失去响应,然后nginx出现"504 Gateway Time-out"查看错误日志也看不到任何东西,以为是apache的bug(其实不是,下面会说原因). 也许年龄大了人就不爱折腾,愿意保持原状不动,使用监控工具,每次收到报警后都重新启动apache勉强维持着.终于有一天我烦了,不就是处理php吗,我不用apache总行了吧,一怒之

  • 完美解決Nginx 504 Gateway time-out问题

    最近用dedecms建的一个网站新增了大批内容,有三个栏目的内容量都超过了两千篇,超过两千三百篇的两个栏目在生成栏目列表的时候就出现了504 Gateway time-out 服务器用的是nginx,我不是很懂,服务器维护人员在网上随便找了一篇文章,修改了nginx的缓存设置,不管用,他就不管了,可是我不能不管啊,不能生成列表页面,那后面的内容不是都不能用了麽? 把数据库下载到本地,在本地配置了nginx,试了很多遍,都不行,又改到Apache下面,更夸张,生成了83个页面就不能继续了,看来还是

  • Nginx 502 bad gateway和Nginx 504 Gateway Time-out错误解决方法 错误解决办法

    最近服务器宕机的现象比较频繁,临下班时分,G给挂掉了,502 Bad Gateway Nginx,不由得让我想起之前的504 Gateway Time-out,两者应该有点联系,一定得弄清楚.Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-o

  • nginx 504 Gateway Time-out错误解决方法

    一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out 现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K 默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点 在nginx.conf里, 加入: fastcgi_buffers 8 128k 这表示设置fastcgi缓冲区为8×1

  • Nginx 504 Gateway Time-out的两种最新解决方案

    目录 背景: 问题: 504从哪来:本文的场景下504是nginx返回的. 两种解决方案 其他问题: 总结 背景: Nginx做反向代理,springboot为后端服务. 问题: 通过浏览器向后台发起请求够,由于后台处理时间长,出现504 Gateway Time-out,实际后台程序依然在执行.如何解决? 504从哪来:本文的场景下504是nginx返回的. nginx配置中控制该超时时间的属性: Syntax: proxy_read_timeout time; Default: proxy_

  • Matplotlib中文乱码的两种详细解决方案

    目录 前言 Matplotlib中文乱码 重写配置文件 修改配置文件 总结 前言 Matplotlib 默认不支持中文字体,这因为 Matplotlib 只支持 ASCII 字符,但中文标注更加符合中国人的阅读习惯.因此,本节重点讲解如何在 Windows 环境下让 Matplotlib 显示中文. Matplotlib中文乱码 当不对 Matplotlib 进行设置,而直接使用中文时,绘制的图像会出现中文乱码.下面是一个含有中文乱码的折线图: 从上图可以看出,本应该显示在红框内的中文字体没有显

  • nginx 让users有权限启动的两种方法

    nginx 让users有权限启动两种方法 普通用户在restart和reload nginx时,会报错: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /opt/nginx/conf/nginx.conf:1 我又不能给开发人员root权限,没办法,只好这么做. 原因是:默认情况下Linux的1024以下端口是只有root用

  • Mybatis控制台打印SQL语句的两种方式实现

    问题描述 在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们.但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql就会非常的难,这个时候经常会需要把组合之后的完整sql调试出来比较好.下面来看两种调试出sql的两种方式 解决方案 方案1: 网上说的比较多的,之前也是这么用的一种方式 1:首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句 2:添加如下语句: ###

  • Nginx 502 bad gateway错误解决的九种方案及原因

    目录 前言 502系列错误代码 5XX系列错误代码 Nginx 502 Bad Gateway 错误的原因及解决方法 1.检查PHP基础设置 2.FastCGI进程是否已经启动 3.FastCGI worker进程数是否不够 4.FastCGI执行时间过长 5.FastCGI Buffer不够 6.FastCGI 缓冲区设置过小 7.代理缓冲区设置过小(使用了nginx反向代理的情况) 8.默认php-cgi的进程数设置过少 9.其它原因 总结 前言 502 Bad Gateway 是一种HTT

随机推荐