Java 大约17分钟后用于Tomcat终止连接的Nginx代理

Java 大约17分钟后用于Tomcat终止连接的Nginx代理,java,tomcat,nginx,Java,Tomcat,Nginx,我使用运行在Ubuntu 16.04.1上的Tomcat 8.5.28,使用Nginx 1.10.2作为Spring Boot 2应用程序的反向代理。我们的一个端点将大量数据流回到客户端。连续流媒体传输大约17分钟后,Nginx似乎终止了连接 在Java应用程序中,我得到: org.apache.catalina.connector.ClientAbortException: java.net.SocketTimeoutException at org.apache.catalina.c

我使用运行在Ubuntu 16.04.1上的Tomcat 8.5.28,使用Nginx 1.10.2作为Spring Boot 2应用程序的反向代理。我们的一个端点将大量数据流回到客户端。连续流媒体传输大约17分钟后,Nginx似乎终止了连接

在Java应用程序中,我得到:

org.apache.catalina.connector.ClientAbortException: java.net.SocketTimeoutException
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:356) ~[tomcat-embed-core-8.5.28.jar!/:8.5.28]
    at org.apache.catalina.connector.OutputBuffer.appendByteArray(OutputBuffer.java:785) ~[tomcat-embed-core-8.5.28.jar!/:8.5.28]
    at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:721) ~[tomcat-embed-core-8.5.28.jar!/:8.5.28]
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:391) ~[tomcat-embed-core-8.5.28.jar!/:8.5.28]
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:369) ~[tomcat-embed-core-8.5.28.jar!/:8.5.28]
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) ~[tomcat-embed-core-8.5.28.jar!/:8.5.28]
在Nginx错误日志中:

[error] 18876#18876: *70244827 readv() failed (104: Connection reset by peer) while reading upstream, client: xxx, server: xxx, request: "GET xxx", host: "xxx"
在客户端(curl)上:

我一直在使用卷曲和速率限制来测试这一点,以将传输速度降低到17分钟以上。如果它在17分钟内完成,或者我绕过Nginx直接连接到Java应用程序,它就会工作

Nginx虚拟主机:

upstream grouse_local {
    server 127.0.0.1:8143;
}

server {
    listen 443 ssl;
    server_name ...;
    access_log /var/log/nginx/grouse_local_access.log;
    error_log /var/log/nginx/grouse_local_error.log;
    ssl_certificate ...;
    ssl_certificate_key ...;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    gzip on;
    gzip_proxied any;
    gzip_types text/css text/plain text/xml application/xml application/javascript application/x-javascript text/javascript application/json text/x-json text/csv;
    gzip_vary on;
    gzip_min_length 1000;

    location / {
        proxy_pass http://grouse_local/;
        proxy_next_upstream error timeout http_502;
        proxy_http_version 1.1;
        set_real_ip_from ...;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

有什么想法吗?我不想在我们的API文档中添加“不要流超过17分钟”:不知道这是否有帮助,但17分钟比1024秒短4秒。嗯。上一次测试是17m13s,大约需要5秒才能开始,因此可能需要1024秒的超时时间。我还尝试通过127.0.0.1使用“Host:xxx”头连接到Nginx,而不是使用外部接口,但仍然失败
upstream grouse_local {
    server 127.0.0.1:8143;
}

server {
    listen 443 ssl;
    server_name ...;
    access_log /var/log/nginx/grouse_local_access.log;
    error_log /var/log/nginx/grouse_local_error.log;
    ssl_certificate ...;
    ssl_certificate_key ...;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    gzip on;
    gzip_proxied any;
    gzip_types text/css text/plain text/xml application/xml application/javascript application/x-javascript text/javascript application/json text/x-json text/csv;
    gzip_vary on;
    gzip_min_length 1000;

    location / {
        proxy_pass http://grouse_local/;
        proxy_next_upstream error timeout http_502;
        proxy_http_version 1.1;
        set_real_ip_from ...;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}