Nginx 下 504 Gateway Time-out 解决方案

编程之家收集整理的这篇文章主要介绍了Nginx 下 504 Gateway Time-out 解决方案编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

通过浏览器向后台发起请求够,由于后台处理时间长,实际后台程序依然在执行 ,Nginx 已经返回 504 Gateway Time-out 的解决方案,下方主要介绍关于Nginx 下 504 Gateway Time-out 解决方案的全文内容,希望对你有所帮助。

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

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

如果你恰好在寻找这种问题解决方案,并且不喜欢啰嗦,直接移动到:两种解决方

目录

两种解决方案


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

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

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

官方地址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();
            }
        }
    }@H_404_31@

其他问题

如果你遇到异常

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 解决方案所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

Nginx文章

3分钟搞懂阿里云服务器安装Nginx,并配置访问静态页面!
文章目录前言一、准备工作1、下载需要更新的nginx版本,解压2、编译并make(不进行make install)二、升级方法一1.备份安装目录下的nginx2、复制objs目录下的nginx到当前sbin目录下3、发送信号usr2给nginx老版本对应的进程4、发送信号quit给nginx老版本的进程5、查看是否升级成功三、升级方法二1.备份安装目录下的nginx2、复制objs目录下的nginx到当前sbin目录下3、进入到安装目录,执行make upgrade4、查看是否升级成功总结前言在工作当
需求描述公司为了保证网络安全,所有系统访问网址需要采取https+域名(隐藏端口)的形式进行访问
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率,受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益测试配置所需环境盗链端http服务端nginx。...
史上最诚意满满的事故复盘
掌握nginx中的常见配置,让你更快的熟练应用
视频Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50000 个并发连接数。正向代理:需要在客户端配置代理服务器进行指定网站访问反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。​ 客户端发送多个请求到服务器
本文介绍LVS,Nginx,Haproxy这三种负载均衡产品的区别。
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注