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