>问题
我在 Kong 错误日志中收到一条错误消息,报告上游服务器已超时。但我知道上游进程只需要一分钟多一点,当它完成时(在 Kong 记录错误之后(,它会记录一个 java 错误"Broken Pipe",这意味着 Kong 不再侦听响应。
这是上游进程花费超过 60 秒时的行为。在某些情况下,只需不到 60 秒的时间,一切正常。
如何延长 Kong 的超时时间?
详
孔版
1.1.2
Kong的错误消息(略有编辑(:
2019/12/06 09:57:10 [error] 1421#0: *1377 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xyz.xyz.xyz.xyz, server: kong, request: "POST /api/...... HTTP/1.1", upstream: "http://127.0.0.1:8010/api/.....", host: "xyz.xyz.com"
这是来自上游服务器日志的错误(Java/Tomcat通过SpringBoot(
Dec 06 09:57:23 gateway-gw001-99 java[319]: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
Dec 06 09:57:23 gateway-gw001-99 java[319]: at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:364) ~[tomcat-embed-core-8.5.42.jar!/
Dec 06 09:57:23 gateway-gw001-99 java[319]: at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:833) ~[tomcat-embed-core-8.5.42.jar!
...
我的Kong.conf(略有编辑(
trusted_ips = 0.0.0.0/0
admin_listen = 0.0.0.0:8001
proxy_listen = 0.0.0.0:8080 proxy_protocol, 0.0.0.0:8443 ssl proxy_protocol
database = postgres
pg_host = 127.0.0.1
pg_port = 5432
pg_user = kong
pg_password = xyzxyzxyzxyzxyz
pg_database = kong
plugins = bundled,session
real_ip_header = proxy_protocol
更多背景
- Kong和上游服务器托管在同一个Ubuntu VM上 Ubuntu VM
- 作为 Linux 容器 (LXC( 托管在另一个 Ubuntu VM 中
- 外部虚拟机使用 NGinX 接收公共流量并将其反向代理到 Kong。它使用流来做到这一点。这允许Kong成为我的SSL分界点。
外部 NGinX 流配置:
stream {
server {
listen 80;
proxy_pass xyz.xyz.xyz.xyz:8080;
proxy_protocol on;
}
server {
listen 443;
proxy_pass xyz.xyz.xyz.xyz:8443;
proxy_protocol on;
}
}
我尝试过什么
我尝试将以下行添加到 kong.conf。在 Kong 的 1.1.2 版本中,您基本上可以通过向 NginX 配置添加前缀并将它们放置在 kong.conf (https://docs.konghq.com/1.1.x/configuration/#injecting-individual-nginx-directives 中来远程更改 NGinX 设置。他们似乎都没有做任何事情:
nginx_http_keepalive_timeout=300s
nginx_proxy_proxy_read_timeout=300s
nginx_http_proxy_read_timeout=300s
nginx_proxy_send_timeout=300s
nginx_http_send_timeout=300s
根据文档Kong
版本 0.10 有三个属性,您可以设置这些属性来管理proxy
upstream_connect_timeout
: 以毫秒为单位定义 建立与上游服务的连接。upstream_send_timeout
:定义传输请求的两个连续写入操作之间的超时(以毫秒为单位( 到您的上游服务。upstream_read_timeout
: 以毫秒为单位定义两次连续读取之间的超时 用于从上游服务接收请求的操作。
在这种情况下,由于等待上游响应超时Kong
因此需要为upstream_read_timeout
添加属性设置
在Kong
V1.1 文档中,Service 对象现在包含以下名称略有不同的超时属性:
connect_timeout
:与上游服务器建立连接的超时(以毫秒为单位(。默认值为 60000。- 请求传输到上游服务器的两个连续写入操作之间的超时(以毫秒为单位(。默认值为 60000。
- 请求传输到上游服务器的两个连续读取操作之间的超时(以毫秒为单位(。默认值为 60000。
write_timeout
:将read_timeout
:将如果你使用 Kubernetes,你必须在服务中指定一个特殊的注释:
konghq.com/override: {{ ingressName }}
不过,没有明显的。 我在这里发现了它 https://github.com/Kong/kubernetes-ingress-controller/issues/905#issuecomment-739927116
服务示例:
apiVersion: v1
kind: Service
metadata:
name: websocket
annotations:
konghq.com/override: timeout-kong-ingress
spec:
selector:
app: websocket
ports:
- port: 80
targetPort: 8010
有关详细说明,请点击上面的链接